verilog 中生成块内的 defparam

问题描述 投票:0回答:1

在设计中,顶层模块 A 有另一个模块 B 的两个实例

module A (....);
B (.C(C1)...) inst1;
B (.C(C2)...) inst2;

模块 B 有一些参数,我想使用生成块从测试台分配这些参数。

//Testbench
module test_top ();
A (....) A1;
generate 
for (genvar k = 0; k<2; k++) begin
    defparam A1.instk.C = 0;
end
endgenerate 

NCSIM 上的编译导致 defparam 语句出现错误。它无法获取实例的路径。可能是因为生成语句。 在生成块中使用 defparam 是否合法?

verilog system-verilog
1个回答
1
投票

首先,不要使用

defparam
- 它已被弃用。相反,请使用
#( ... )
语法设置参数。

其次,如果您希望使用

B
来引用模块
genvar
的实例,则需要处于生成循环中。

最后,如果您确实想将 分层命名

generate
一起使用,那么您必须在
generate
语句内命名该块。
$display
块中的
initial
给出了一个示例 - 模块实例
I
内的
A1
的分层名称。

例如:

module A #(integer WIDTH) (input [WIDTH-1:0] I, output [WIDTH-1:0] O);

  generate 
    for (genvar k = 0; k<WIDTH; k++) begin : BLOCK_NAME
      B #(.WIDTH(WIDTH),.BIT(k)) Binst (.I(I), .O(O[k]));
    end
  endgenerate 

endmodule

module B #(integer WIDTH, BIT) (input [WIDTH-1:0] I, output O);

  assign O = I[BIT];

endmodule

module test_top;

  reg [1:0]  I;
  wire [1:0] O;

  A #(.WIDTH(2)) A1 (.I(I), .O(O));

  initial
    $display("I[1]= %b", test_top.A1.BLOCK_NAME[1].Binst.I);

endmodule

http://www.edaplayground.com/x/4PyL

© www.soinside.com 2019 - 2024. All rights reserved.