英特尔 Quartus Prime Pro Edition用户指南: 设计建议

ID 683082
日期 8/03/2023
Public
文档目录

1.9. 在HDL代码中使用force语句

SystemVerilog中的force语句是一个对网络(net)和变量的连续过程赋值(continuous procedural assignment)。
force语句应用于网络或者变量会覆盖该网络或变量的所有驱动器(driver)。在仿真中,您可以将force语句与release语句一起使用。然而,英特尔Quartus Prime软件综合仅支持使用force语句来覆盖一个网络(门输出,模块输出和连续赋值)的驱动器以及之前在特定网络或网络总线上进行的赋值。
注: 综合(synthesis)仅支持在初始模块内使用force语句。

综合(synthesis)中的force语句示例

以下是英特尔Quartus Prime软件综合支持的一些force语句示例:

使用force语句将Counter enable设置为0

以下是如何使用force语句将counter实例u1en端口连接到逻辑0的一个示例:

module top(clk, rst, enable, dout);
  input clk, rst, enable;
  output [3:0] dout;
  counter u1(.clk(clk), .reset(rst), .en(enable), .q(dout));

  initial  begin
    force u1.en = 1'b0
  end
endmodule

您可以观察到force语句覆盖了en端口的另一个驱动器,即top模块的enable端口。

使用force语句更改连接

以下示例展示了如何使用force语句来更改设计中的连接:

module top(input [3:0] din, din1, output logic [3:0] dout, dout1, input clk, rst);
  dff i0(.din(din), .dout(dout), .clk(clk), .rst(rst) );
  dff i1(.din(din1), .dout(dout1), .clk(clk), .rst(rst) );
endmodule

module top_modified(input [3:0] din, din1, output logic [3:0] dout, dout1, input clk, rst);
  top i_top(.*);
  initial 
  begin
    force i_top.i1.din = i_top.din;
  end
endmodule

在此示例中,设计的top模块例化了dff模块的两个实例。top模块的dindin1端口驱动i0i1实例的din端口。

假设您想要在不更改top模块中的RTL的情况下更改top模块中的连接。在这种情况下,您可以在wrapper模块(top_modified)中使用force语句,此模块成为一个新的top模块。在新的top模块中,使用force语句来修改top模块中的连接,以便i0i1实例的din端口都由top模块的同一din端口进行驱动。force语句使用跨模块引用(XMR)来访问其下方层次结构中的信号。关于XMR的更多信息,请参考HDL代码中的跨模块引用(XMR)

注:

关于此示例,除了创建一个用于例化top模块的wrapper top_modified,您还可以创建一个次级顶层实体并在此实体中进行force assignment,如下所示:

module secondary_top(input [3:0] din, din1, output logic [3:0] dout, dout1, input clk, rst);
initial begin
  force top.i1.din = top.din;
end
endmodule