Verilog/SV 条件变量定义

Verilog/SV conditional variable definition

有没有办法根据参数来操作变量实例化?

例如,如果我在这里只放置 bit [WIDTH-1:0] a; 并设置 DEPTH == 1,则 WIDTH 将为 0,而 bit [-1:0] a; 将没有意义。

当我像下面的例子一样编码时,我在第二个 $display 上收到错误:"Undeclared identifier: a"。有没有办法在 Verilog/SV 中实现这一点,或者我的代码有错误?

module test #(
  parameter DEPTH = 2,
  parameter WIDTH = $clog2(DEPTH)
)();

  generate
    if (WIDTH == 0) begin
      bit             a;
    end else begin
      bit [WIDTH-1:0] a;
    end
  endgenerate

  initial begin
    $display("WIDTH: %d", WIDTH);
    $display("Bit width of a: %d", $bits(a));
  end
endmodule: test

您只需

bit [(WIDTH>0 ? WIDTH-1 : 0):0] a;

您使用的是哪个版本的 Verilog? $clog2 是在 Verilog-2005 中引入的。先前的实施可能会产生奇怪的结果。

见下文,我做了一个循环来显示增量深度与 clog2 的结果。

CLOG2(0) =           0
CLOG2(1) =           0
CLOG2(2) =           1
CLOG2(3) =           2
CLOG2(4) =           2

表示1的值,比如需要1位,不是0 要表示 2 的值,您需要 2 位……而不是 1。 要表示 4 的值,您需要 3 位。 CLOG2 在转换点处始终短接 1。随着您的成长,先前的解决方案不会考虑到这一点。

所以如果你说

WIDTH = $clog(DEPTH+1);

我想你会自动得到你想要的结果。

我经常制作和使用它。它确定整数值的位宽度。 0 的特殊情况将 return 值为 1(您仍然需要 1 位来保存该值)。假设您需要根据具有 256 个地址的内存定义一个索引变量

参数NUM_ADDR256

localparam A_SZ = bit_size(NUM_ADDR-1); // 示例:255(最高地址)应该 return 8

逻辑[A_SZ-1:0]索引; // 示例:[7:0] 索引

那么我需要改变的就是NUM_ADDR

function integer bit_size;
input integer value;
reg [31:0] shifted;
integer res;
begin
  if (value != 0)
  begin
       shifted = value;
       for (res=0; (shifted != 0); res=res+1)
           shifted = shifted >> 1;
       bit_size = res;
  end
  else
     bit_size = 1; // minimum size, even for a value of 0
end
endfunction