在verilog代码中只给出1和给出1'b1有什么区别?
3 回答
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 !!!!
那么,有什么区别,比如说,
logic [7:0] count;
...
count <= count + 1'b1;
和
logic [7:0] count;
...
count <= count + 1;
不是很多。在第一种情况下,您的模拟器/合成器将执行此操作:
i)扩展1'b1
为8'b1
(因为count
是 8 位宽)ii)使用 8 位做所有的数学运算(因为现在一切都是 8 位宽)。
在第二种情况下,您的模拟器/合成器将执行此操作:
i) 使用 32 位进行所有数学运算(因为1
是 32 位宽)ii) 将 32 位结果截断为 8 位宽(因为计数是 8 位宽)
行为将是相同的。然而,情况并非总是如此。这个:
count <= (count * 8'd255) >> 8;
和这个:
count <= (count * 255) >> 8;
会有不同的表现。在第一种情况下,乘法将使用 8 位(8
in 的宽度>> 8
无关紧要),因此乘法将溢出;在第二种情况下,32 位将用于乘法,所以一切都会好起来的。
1'b1
是二进制、无符号、1 位宽的整数值。在原始的 verilog 规范中,1
具有与integer
. 它已签名,但未指定其宽度。工具可以根据类型的宿主实现来选择宽度int
。
integer
从 Verilog 2001 和 SystemVerilog 2005 开始,和的宽度int
固定为 32 位。然而,由于这个原始的未指定宽度,以及很多人编写0
或1
没有意识到它现在是 32 位宽的事实,该标准不允许您在串联中使用无基础的文字。{A,1}
是非法的。