【问题标题】:How to properly handle zero bit width case?如何正确处理零位宽情况?
【发布时间】:2019-05-28 15:11:37
【问题描述】:

在写泛型模块的时候,经常会遇到0位宽的情况。

module test #(
    parameter WIDTH
) (
    input logic [31 : 0] x,
    output logic [31 : 0] y
);
    always_comb begin
        y = x[WIDTH - 1 : 0];
    end
endmodule

例如,上述模块从 x 中提取最低 WIDTH 位。 当 WIDTH 为 0 时,不关心输出。 但是,当使用 WIDTH 0 实例化模块时,我在 Modelsim 中收到以下错误:

# ** Fatal: (vsim-3373) test.sv(8): Range of part-select [-1:0] into 'x' [31:0] is reversed.

我尝试了以下代码,希望在编译时优化掉错误的部分,但错误仍然存​​在。

if (WIDTH == 0) y = 0;
else y = x[WIDTH - 1 : 0];

这种情况有什么补救措施吗?

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    您的程序代码需要编译,即使具有错误范围的分支从未被采用。

    module test #(
        parameter WIDTH
    ) (
        input logic [31 : 0] x,
        output logic [31 : 0] y
    );
        always_comb
           if (WIDTH == 0) y = 'x;
           else y = x[WIDTH - 1 + (WIDTH==0): 0];
    endmodule
    

    你也可以

    module test #(
        parameter WIDTH
    ) (
        input logic [31 : 0] x,
        output logic [31 : 0] y
    );
    if (WIDTH==0)
      assign y = 'x;
    else
      assign  y = x[WIDTH - 1: 0];
    endmodule
    

    【讨论】:

    • 我更喜欢在 always_comb 中处理它(没有分配),但是当 y 不在乎时,第一种方法将不起作用。 (x[0] into y) 虽然我给出了不关心的例子,但我的实际模块需要在 WIDTH 为 0 时输出 0。在这种情况下还有其他方法吗?
    • 哦,我错了,x[0] 没有进入 y。虽然它看起来并不“干净”,但它确实有效。谢谢。
    • 在我的第二个示例中,您可以将 assign 替换为 always_comb。只要if 保留在程序代码之外,它就会变成generate-if 构造。
    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 2011-02-20
    • 2013-03-21
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    相关资源
    最近更新 更多