【问题标题】:Difference between 1 and 1'b1 in VerilogVerilog中1和1'b1之间的区别
【发布时间】:2019-11-29 06:37:05
【问题描述】:

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

【问题讨论】:

  • 欢迎来到 Stackoverflow。请参考stackoverflow.com/help/how-to-askstackoverflow.com/help/mcve。提供您所面临问题的更多细节。包括你目前尝试过的相关代码sn-ps。
  • @NJInamdar 我希望它以前被问过很多次,但事实上,这是一个很好的问题。
  • @NJInamdar, 11'b1 是相关代码。
  • 请注意,在 Plain-Old-Verilog 中,未指定大小的数字或整数变量的大小至少 32 位(直到 V-2005)。下面说它正好是 32 位的说法是不正确的。

标签: embedded verilog system-verilog iverilog


【解决方案1】:

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 !!!!

【讨论】:

  • 那么32是默认位长吗?
  • @YashwanthGopinath Verilog 中所谓的unbased literals(例如1)是32 位有符号数字。这不是 默认 本身,它就是这样。
【解决方案2】:

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

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 位宽(因为 count 是 8 位宽)

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

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

还有这个:

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

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

【讨论】:

  • 我给出了这个答案,因为我对你的问题的阅读比我想象的要多。我从您对另一个答案的评论中看到,您只是想知道所谓的 unbased literal 中有多少位。无论如何,这个答案可能会引起未来的 Google 员工的兴趣。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 2020-04-01
    • 2018-05-05
    • 1970-01-01
    • 2022-05-04
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多