【问题标题】:Diference in bit selection in VerilogVerilog中位选择的差异
【发布时间】:2020-05-06 14:30:34
【问题描述】:

我有类似下面的代码

module testModule(
    input        Clk,
    input  [2:0] Counter,
    output [1:0] OutVar1,
    output [1:0] OutVar2
);

    localparam logic [7:0] mask = 8'h50;

    // CODE 1
    always_ff @(posedge Clk) begin
        case (mask[{Counter[1:0], 1'b0} +: 2])
            2'h0 : OutVar1 <= 2'h0;
            2'h1 : OutVar1 <= 2'h1;
            2'h2 : OutVar1 <= 2'h2;
            2'h3 : OutVar1 <= 2'h3;
            default: OutVar1 <= 2'hX;
        endcase
    end

    // CODE 2
    always_ff @(posedge Clk) begin
        case (mask[(Counter[1:0]<<1) +: 2])
            2'h0 : OutVar2 <= 2'h0;
            2'h1 : OutVar2 <= 2'h1;
            2'h2 : OutVar2 <= 2'h2;
            2'h3 : OutVar2 <= 2'h3;
            default: OutVar2 <= 2'hX;
        endcase
    end

endmodule

Counter 是 0、2、4、6、0、2、4 等的输入。 我希望 CODE 1 和 CODE 2 的行为相同,但是当计数器为 2 和 6(计数器 [1:0] 为 2)时,我在 CODE 1 中遇到了 2'h1(正确),在 CODE 2 中遇到了 2'h0(错了)。

我还没有检查如果计数器变为 0、1、...、7、0、1 等时的行为是什么。

我没有测试平台,因为这段代码是一个大型项目的一部分。我在模拟和看到波浪后看到了问题。

我错过了什么?

【问题讨论】:

  • 我已经更新了这个问题,掩码值为 0x50(它在代码中的其他地方设置)但就这个问题而言,它可以是一个 8 位的常量值。
  • 您示例中的代码没有意义。所有这些引用的字符串是什么意思?
  • 引用的字符串是占位符。在我的代码中,我有其他变量的分配,但这无关紧要
  • 我已经更新了代码。希望它更清楚。

标签: verilog system-verilog


【解决方案1】:

我怀疑你错过了“CODE 2”中只有 2 位用于计算答案,因为它是一个所谓的自定表达式。因此,Verilog 采用以下表达式:

counter[1:0]<<1

并且需要决定使用多少位来回答。这就是它的作用:它查看移位运算符 (2) 左侧有多少位,并使用它来输入结果。它还能做其他事情吗?右侧的位数 (32) 基本上是无关紧要的(除非您认为 Verilog 应该使用 2^31-1 位的结果!)。所以,你得到一个溢出 - 移位结果的左侧被截断。

this answer here

【讨论】:

  • 这是我的第一个想法,但我的以下代码工作正常logic [1:0] counter;... (same code as before)...// CODE 2case (mask[(counter&lt;&lt;1) +: 2])... (same code as before)...
  • 这应该可以修复您的代码:mask[({1'b0, Counter[1:0]}&lt;&lt;1)
  • 第一版的代码已经解决了。我只是想了解为什么另一个失败了
猜你喜欢
  • 1970-01-01
  • 2018-08-05
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多