1

我有以下子模块:

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

...

endmodule

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

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

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

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

谢谢,

4

2 回答 2

5

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

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]信号。
于 2013-10-29T17:38:50.173 回答
1

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

于 2013-10-29T21:54:51.517 回答