在generate
块中,我有多个if
语句。当我在第一个if语句中声明一个连线时 - 我不能在其他if
语句中使用它
请参阅我的模块的以下精简示例:
module my_module
#(parameter integer NUM_X_PORTS = 1,
parameter integer NUM_Y_PORTS = 1)
(
// port declarations
);
generate
if (NUM_X_PORTS > 0) begin
wire [NUM_X_PORTS-1:0] x1;
// logic filled in here
end
if (NUM_Y_PORTS > 0) begin
wire [NUM_Y_PORTS-1:0] y1;
// logic filled in here
end
if ((NUM_X_PORTS > 0) && (NUM_Y_PORTS > 0)) begin
for (i=0; i<NUM_Y_PORTS; i=i+1) begin
assign z[i] = y1[i] & |x1; // I can't use x1 and y1 here
end
endgenerate
来自VCS和nLint的错误消息是尚未声明标识符x1和y1。
但是它们已在之前生成的if语句中声明 - 这里有什么问题?
答案 0 :(得分:7)
电线x1
和y1
在作业范围之外定义。一种解决方案是添加和引用范围标签:
if (NUM_X_PORTS > 0) begin : scope_x1
wire [NUM_X_PORTS-1:0] x1;
// logic filled in here
end
if (NUM_Y_PORTS > 0) begin : scope_y1
wire [NUM_Y_PORTS-1:0] y1;
// logic filled in here
end
if ((NUM_X_PORTS > 0) && (NUM_Y_PORTS > 0)) begin : scope_z
for (i=0; i<NUM_Y_PORTS; i=i+1) begin : scopes_z_i_ // loop has unique scope
// x1 & y1 accessed by scope label found by its parent
assign z[i] = scope_y1.y1[i] & |scope_x1.x1;
end
end
对于工作分配,x1
和y1
的声明必须存在,范围为scope_2
或其父级。
if ((NUM_X_PORTS > 0) && (NUM_Y_PORTS > 0)) begin : scope_z
wire [NUM_X_PORTS-1:0] x1;
wire [NUM_Y_PORTS-1:0] y1;
// logic filled in here
for (i=0; i<NUM_Y_PORTS; i=i+1) begin : scopes_z_i_ // loop has unique scope
assign z[i] = y1[i] & |x1; // everything is withing scope_z
end
end
在这两种情况下,x1
和y1
的范围都有限。如果您希望电线在其受尊重的NUM_*_PORTS > 0
为假时存在,那么您必须遵循第一个示例。
有关生成的更多信息,请参阅IEEE Std 1800-2012§27生成构造