【问题标题】:Defining an array in verilog down to a nonzero constant在verilog中定义一个数组到一个非零常数
【发布时间】:2013-10-29 17:28:02
【问题描述】:

我有以下子模块:

module test
(
input [LENGTH : 1] array;
);

...

endmodule

我从一个顶级模块中调用它,如下所示:

...
wire [LENGTH-1 : 0] array_top;
test test_i
(
.array (array_top);
);
...

假设两个模块中的 LENGTH 相同。

  1. 如果 array_top 下降到零但数组下降到 1,array_top 将如何映射到数组?
  2. 为什么有人会定义一个低至 1 而不是低至 0 的数组?
  3. array[0] 会发生什么?

谢谢,

【问题讨论】:

    标签: arrays verilog


    【解决方案1】:

    你的问题可以用一个小测试台来回答:

    module tb;
    
    reg [3:0] atop;
    initial begin
        $monitor("array_top=%b, array=%b", array_top, test_i.array);
        #1 atop = 4'b0000;
        #1 atop = 4'b0001;
        #1 atop = 4'b0010;
        #1 atop = 4'b0100;
    end
    
    wire [3:0] array_top = atop;
    test test_i (.array (array_top));
    
    endmodule
    
    module test (input [4:1] array);
    endmodule
    

    输出:

    array_top=xxxx, array=xxxx
    array_top=0000, array=0000
    array_top=0001, array=0001
    array_top=0010, array=0010
    array_top=0100, array=0100
    
    1. 来自您的连接:array[1] = array_top[0] 等
    2. 有时人们希望省略连接信号的 LSB,例如内存地址,因为 LSB 没有任何作用。
    3. 没有array[0] 信号。

    【讨论】:

      【解决方案2】:

      在连接端口时,Verilog 只关心数组是否具有相同的大小(在 SystemVerilog 中称为equivalent type),而不关心起始索引值,也不关心它是增加还是减少。它将首先连接每个信号的正确范围 (LSB)。在您的情况下,array_top[0] 连接到 array[1]。如果大小不匹配,您可能会收到错误或警告,具体取决于工具及其设置。然后在达到左侧范围 (MSB) 后,连接将被填充或截断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多