【问题标题】:I don't understand this define macro with replication我不明白这个带复制的定义宏
【发布时间】:2021-01-21 21:44:17
【问题描述】:

我有 SystemVerilog 代码,其中使用了我不理解的复制。请认真回答。

parameter WIDTH = 6;
logic [WIDTH-1:0] flag, flag2;

`define ZERO_X(n, m) {{m-$bits(n){1'b0}}, (n)}

assign flag = flag2 - `ZERO_X(1'b1, WIDTH);

【问题讨论】:

    标签: verilog system-verilog operator-precedence


    【解决方案1】:

    第一步是在这个表达式中执行简单的文本替换。将n 替换为1'b1,将m 替换为WIDTH。所以这个:

    `ZERO_X(1'b1, WIDTH)
    

    变成:

    {{WIDTH-$bits(1'b1){1'b0}}, (1'b1)}
    

    WIDTH 替换为6

    {{6-$bits(1'b1){1'b0}}, 1'b1}
    

    $bits(1'b1) 计算结果为 1

    {{(6-1){1'b0}}, 1'b1}
    

    6-1 只是5

    {{5{1'b0}}, 1'b1}
    

    {5{1'b0}} 复制 1'b0 到 5 个 0:

    {5'b0_0000, 1'b1}
    

    然后是简单的串联:

    6'b00_0001
    

    因此,这一行:

    assign flag = flag2 - `ZERO_X(1'b1, WIDTH);
    

    评估为:

    assign flag = flag2 - 6'b00_0001;
    

    【讨论】:

      【解决方案2】:

      此代码试图将其操作数 0 扩展为 WIDTH,这完全没有必要。根据 Verilog 规则,1'b1 操作数已经扩展到其所写表达式上下文中最大操作数的宽度。

      assign flag = flag2 - 1'b1;
      

      但如果您想清楚地显示该扩展,您可以编写显式转换:

      assign flag = flag2 - WIDTH'(1'b1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        • 2020-03-03
        • 2012-03-04
        • 2015-05-29
        • 2016-06-23
        • 2015-06-09
        相关资源
        最近更新 更多