【发布时间】:2020-06-28 09:13:24
【问题描述】:
这些方式在 Verilog 中初始化向量有什么区别?
reg [3:0] vector = 4'b0000;
或
reg [3:0] vector = 0;
我在第一次初始化中看到的唯一优势是直接设置每一位。但是在这个例子中将向量设置为零,有区别吗?一种方式比另一种更好吗?
编辑:
我稍微扩展了 mcleod_ideafix 的测试程序来检查一些其他的东西:
module tb;
reg [15:0] v5, v6, v7, v8, v9, v10;
initial begin
v6 = 1'b0;
v7 = 1'b1;
v8 = 2'b1111;
v9 = 'b1;
v10 = 6'b11;
$display ("v5(=/) = %b\nv6(=1'b0) = %b\nv7(=1'b1) = %b\nv8(=2'b1111) = %b\nv9(='b1) = %b\nv10(=6'b11) = %b", v5, v6, v7, v8, v9, v10);
$finish;
end
endmodule
结果:
v5(=/) = xxxxxxxxxxxxxxxx
v6(=1'b0) = 0000000000000000
v7(=1'b1) = 0000000000000001
v8(=2'b1111) = 0000000000000011
v9(='b1) = 0000000000000001
v10(=6'b11) = 0000000000000011
-
v5 表明,一个未初始化的变量是 x,因此如预期的那样未定义。
-
v6 设置为 1'b0,因此只有一位应设置为 0,但所有位都设置为 0。
-
另一方面,v7 设置为 1'b1,只有最低有效位设置为 1。在我看来,只要将变量设置为一个值,所有未给定的前导位都将设置为零。
-
v8 显示,' 之前的数字限制了 'b' 之后给定数字的大小。 设置 v8 给了我一些警告:
test.v:7:警告:为大小的二进制常量提供了额外的数字。 test.v:7:警告:数字常量被截断为 2 位。
根据给定的警告,我不认为,这个“功能”是有意的,所以我总是更喜欢:
reg [3:0] vector = 2'b10
- 我认为删除数字的长度 (v9) 更省钱,因为在更改数字的值时不可能忘记更新长度。将长度写在数字中的唯一好处是对长度进行交叉检查。因此,如果将长度设置为较小的值的实际长度,我会收到警告。另一方面,将长度设置为长于实际值不会发出警告(v10)。所以交叉检查似乎也不是本意?
回到我的开始问题:这些方式设置矢量并没有真正的区别,不是吗?所以我会使用“长”形式:
reg [3:0] vector = 'b1011;
仅将 reg 设置为二进制或十六进制的特定值。设置为小数或为零:
reg [3:0] vector = 0;
更短、更直观、更省钱,因为我不能忘记改变长度。
只有美学才能让人们写出 1'b0。
【问题讨论】:
-
在 rtl 代码中不以这种方式初始化向量。它在一般情况下是不可合成的(不包括一些 fpga)。除此之外,这两种情况之间没有太大区别。如果您没有使用
2而不是4,第一个会更好。
标签: vector initialization verilog