我想根据实例化模块时设置的参数设置参数。我有以下几点。生成块中的系统Verilog参数
module foo #(WORDS = 8);
parameter P00 = 33;
logic [7:0] tmp;
generate
case (WORDS)
4: begin : A
assign tmp = 8'haa;
parameter P00 = 4;
end
8: begin : B
assign tmp = 8'hbb;
parameter P00 = 8;
end
16: begin : C
assign tmp = 8'hcc;
parameter P00 = 16;
end
default: begin : D
assign tmp = 8'hdd;
parameter P00 = 8;
end
endcase
endgenerate
initial begin
$display ("WORDS = %d", WORDS);
$display ("tmp = %h", tmp);
$display ("P00 = %d", P00);
end
endmodule
我预计会重新定义P00时出现错误,但它会编译并运行并显示下列内容。
WORDS = 8
tmp = bb
P00 = 33
如果我评论“参数P00 = 33”赋值,我会得到一个“标识符P00尚未声明”。错误。
看起来生成块被忽略。这里有什么问题?
如果我正确地阅读了语言规范,实际上当您在生成块中使用参数类型时,实际上是在不同范围内创建新参数。它指出,“在[生成块]中,参数关键字应该是localparam关键字的同义词。”此外,“本地参数与参数相同,但它们不能通过...实例参数值赋值直接修改”。如果您有语言参考的副本并希望了解更多信息,请参阅第6.20.4节。它看起来像你需要一种不同的方法来解决这个问题。 –
@丹 - 谢谢。我没有阅读上面的手册部分,但我没有看到生成块实际上创建了与模块不同的范围。我试图显示C.P00,但也没有工作。如果创建新范围,我如何访问它? – user2382841
我对此并不十分清楚。我刚开始自己学习这门语言,但@Morgan似乎在下面有一个很好的答案。 –