Vector 在Verilog中初始化向量的正确方法

Vector 在Verilog中初始化向量的正确方法,vector,initialization,verilog,Vector,Initialization,Verilog,这些方法在Verilog中初始化向量有什么区别 reg[3:0]向量=4'b0000; 或 reg[3:0]向量=0; 我在第一次初始化中看到的唯一优势是直接设置每个位。但在这个例子中,将向量设置为零,有什么区别吗?一种方式比另一种好吗 编辑: 我对mcleod_ideafix的测试程序进行了一些扩展,以检查其他一些内容: 模块tb; reg[15:0]v5、v6、v7、v8、v9、v10; 初始开始 v6=1'b0; v7=1'b1; v8=2'b1111; v9='b1; v10=6'b

这些方法在Verilog中初始化向量有什么区别

reg[3:0]向量=4'b0000;

reg[3:0]向量=0;
我在第一次初始化中看到的唯一优势是直接设置每个位。但在这个例子中,将向量设置为零,有什么区别吗?一种方式比另一种好吗

编辑:

我对mcleod_ideafix的测试程序进行了一些扩展,以检查其他一些内容:

模块tb;
reg[15:0]v5、v6、v7、v8、v9、v10;
初始开始
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(=1'b1)=%b\nv10(=6'b11)=%b”,v5、v6、v7、v8、v9、v10);
$finish;
结束
端模
其结果是:

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会给我一些警告:

    测试v:7:警告:为大小的二进制常量提供额外数字。 test.v:7:警告:数值常量被截断为2位

根据给出的警告,我不认为此“功能”是有意的,因此我始终希望:

reg[3:0]向量=2'b10
  • 我认为删除数字的长度(v9)更节省,因为在更改数字的值时不可能忘记更新长度。在数字中写入长度的唯一好处是交叉检查长度。因此,如果将长度设置为该值的实际长度,则会收到警告。另一方面,将长度设置为大于实际值不会发出警告(v10)。那么交叉检查似乎也不是目的
回到我的开始问题:这些方法在设置向量方面没有真正的区别,不是吗?因此,我将使用“长”形式:

reg[3:0]向量='b1011;
仅将reg设置为二进制或十六进制的特定值。设置为十进制或零:

reg[3:0]向量=0;
更短,更直观,更节省,因为我不能忘记改变长度


只有美学才能让人写出1'b0。

最初的问题是这样一行代码:

reg [3:0] vector = 2'b0000;

由于使用了
2
作为数值文本值的大小,因此在使用某些模拟器的第一条语句中可能会出现编译警告。您可能打算使用
4

reg [3:0] vector = 4'b0000;

除此之外,您应该看到您的两条语句将以相同的方式进行模拟。

第二条语句将0视为32位整数,因此它等效于

reg [3:0] vector = 32'b0000_0000_0000_0000_0000_0000_0000_0000;
对于模拟:只要向量大小不超过32位,就可以了。您可能会收到有关操作数被截断以适合的警告。但若向量大于32位,在模拟中,从32开始的位将是x

编辑:似乎不是这样,0可以用来初始化任何大小。请参见下面的示例

合成器/编译器将扩展操作数以适应L值的另一种表示法:

reg [3:0] vector = 'b0;
对于FPGA合成,未初始化向量将初始化为合成器/比特流生成过程中配置的默认值,通常为0

module tb;
  reg [3:0] v1, v2, v3;
  reg [127:0] v4;

  initial begin
    v1 = 0;
    v2 = 4'b0000;
    v3 = 'b0;
    v4 = 0;
    
    $display ("%b %b %b %b", v1, v2, v3, v4);
    $finish;
  end
endmodule

[2020-06-28 09:49:37 EDT] iverilog '-Wall' design.sv testbench.sv  && unbuffer vvp a.out  
0000 0000 0000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Done

没有基或大小的数字文字被视为有符号的32位值。Verilog允许从任何大小分配到任何其他大小,并将隐式地截断或扩展该值。这就是所谓的弱类型

当您写入
2'b0000
时,您指定的是一个2位无符号二进制数,但您写出了4位数字。该数字将被截断为2位。但是,由于您正在对一个4位变量进行赋值,因此该值会扩展回4位

因此,对于每种类型的初始化,最终结果都是相同的

编辑:


您的编辑稍微更改了问题主题,但示例中代码的答案仍然相同,结果也是一样的。但在表达式中使用文字时,情况并非总是如此。大小很重要。

在rtl代码中不要以这种方式初始化向量。它在一般情况下是不可合成的(不包括一些fpga)。除此之外,这两种情况之间没有太大差异。如果您没有使用
2
而不是
4
,那么第一个主题会更好。是的,这不是预期的主题,所以我将其更正为4'b0000!这改变了原来的问题。谢谢你的回答!我带你们去测试程序,并用一些其他的值来扩展它,就像我在开始问题中写的那样。