3

在verilog代码中只给出1和给出1'b1有什么区别?

4

3 回答 3

9

1 是 32 位宽,因此相当于32'b00000000_00000000_00000000_00000001

1'b1 有点宽。


有几个地方你应该意识到长度的不同,但最有可能让你发现的地方是串联。{}

reg [ 7:0] A;
reg [ 8:0] B;
   assign A = 8'b10100101;
   assign B = {1'b1,A};  // B is 9'b110100101
   assign B = {1,A};     // B is 9'b110100101
   assign B = {A,1'b1};  // B is 9'b101001011
   assign B = {A,1};     // B is 9'b000000001 !!!!
于 2019-11-29T07:53:23.003 回答
3

那么,有什么区别,比如说,

logic [7:0] count;
...
count <= count + 1'b1;

logic [7:0] count;
...
count <= count + 1;

不是很多。在第一种情况下,您的模拟器/合成器将执行此操作:

i)扩展1'b18'b1(因为count是 8 位宽)ii)使用 8 位做所有的数学运算(因为现在一切都是 8 位宽)。

在第二种情况下,您的模拟器/合成器将执行此操作:

i) 使用 32 位进行所有数学运算(因为1是 32 位宽)ii) 将 32 位结果截断为 8 位宽(因为计数是 8 位宽)

行为将是相同的。然而,情况并非总是如此。这个:

count <= (count * 8'd255) >> 8;

和这个:

count <= (count * 255) >> 8;

会有不同的表现。在第一种情况下,乘法将使用 8 位(8in 的宽度>> 8无关紧要),因此乘法将溢出;在第二种情况下,32 位将用于乘法,所以一切都会好起来的。

于 2019-11-29T08:20:44.173 回答
1

1'b1是二进制、无符号、1 位宽的整数值。在原始的 verilog 规范中,1具有与integer. 它已签名,但未指定其宽度。工具可以根据类型的宿主实现来选择宽度int

integer从 Verilog 2001 和 SystemVerilog 2005 开始,和的宽度int固定为 32 位。然而,由于这个原始的未指定宽度,以及很多人编写01没有意识到它现在是 32 位宽的事实,该标准不允许您在串联中使用无基础的文字。{A,1}是非法的。

于 2019-11-29T18:01:23.897 回答