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
有没有办法根据参数来操作变量实例化?
例如,如果我在这里只放置 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