在设计中,顶级模块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语句出错。它在哪里无法获取实例的路径。可能是因为生成语句。 在genertate block中使用defparam是否合法?
答案 0 :(得分: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
的层次结构名称。
例如:
function addGame() {
if(addGame.flag)
return;
addGame.flag = true;
// rest of procedure ....