gpt4 book ai didi

declaration - verilog 生成 block 内声明的连线问题

转载 作者:行者123 更新时间:2023-12-02 20:11:19 24 4
gpt4 key购买 nike

generate block 中,我有多个 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 语句中声明 - 这里有什么问题?

最佳答案

连线x1y1 是在赋值范围之外定义的。一种解决方案是添加和引用范围标签:

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

要使分配生效,x1y1 的声明必须存在于 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

在这两种情况下,x1y1 的范围都受到限制。如果您不希望该线路在其相关的 NUM_*_PORTS > 0 为 false 时存在,则必须遵循第一个示例。

参见IEEE Std 1800-2012 § 27.生成构造以了解有关生成的更多信息

关于declaration - verilog 生成 block 内声明的连线问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22200666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com