Verilog Testbench常量exp和pram编译仿真错误
Verilog Testbench constant exp and pram compilation and simulation errors
源代码:
module SingleOneBit(N,T);
parameter integer w; //width or number of inputs N
input wire [w-1:0] N;
output wire T;
wire[w*(w-1):0] N1; //for anding all possible combinations of 2 bits
wire R; // for oring all tha ands. If R = 1 then N contians more than one bit with value 1
wire RS; //ors all the bits of the input. Used for checking if there is one bit with value 1 or all 0s
wire R1; // not of R;
buf(R, 0); //initialy R should be 0;
buf(RS, 0); //initialy RS should be 0;
genvar i, j;
generate
for(i = 0; i<w; i=i+1) begin
or(RS,N[i],RS);
for(j = i+1; j<w; j=j+1) begin
and(N1[(i*w)+j], N[i], N[j]);
or(R,N1[(i*w)+j],R);
end
end
endgenerate
not(R1, R);
and(T,RS,R1);
endmodule
测试平台代码:
`include "C:/Users/Muaz Aljarhi/Google Drive/Muaz/Hardware_Designs/Verilog Course/SingleOneBit.v"
module SingleOneBit_tb();
integer n = 5;
reg[n-1:0] N;
wire T;
SingleOneBit sob(.N(N),.T(T));
defparam sob.w = n;
initial begin
$monitor("N = %b, T = %b",N,T);
end
endmodule
此 Verilog Testbench 代码的编译产生以下错误:
** Error: C:/Users/Muaz Aljarhi/Google Drive/Muaz/Hardware_Designs/Verilog Course/SingleOneBit_tb.v(7): Range
must be bounded by constant expressions.
** Error: C:/Users/Muaz Aljarhi/Google Drive/Muaz/Hardware_Designs/Verilog Course/SingleOneBit_tb.v(11):
Right-hand side of defparam must be constant.
如何声明一个可以在测试台中改变的变量或常量表达式?我尝试使用参数,但参数不是可以更改的变量。提前致谢
编辑:我是否必须使用可能不同的输入 reg 变量来声明模块的不同实例化,还是有其他方法?
我也试过这个:
SingleOneBit sob(.N(N[0]),.T(T));
defparam sob.w = 32'd5;
但是模拟,使用 modelsim 产生以下结果:
# ** Error: (vopt-2293) The parameter 'w' in the instance ('/SingleOneBit_tb/sob') of ('SingleOneBit') is declared without a value,
#
# and the instantiation does not provide a value for this parameter.
如何避免在模拟时出现这个错误?再次感谢。
编译器在模块实例化时需要一些参数值。
在 "SingleOneBit" 中提供默认参数值,如下所示:
parameter integer w= 12345;
稍后您可以使用 "defparam" 更改它。
或者你可以像这样在实例化表达式中设置参数:
SingleOneBit #(12345) sob(.N(N[0]),.T(T));
由于参数是编译时(技术上详细说明时)常量,您不能在执行过程中更改它们。因此,sob.w
设置为 n
的第一个错误是无效的,因为 n
在细化阶段无法确定为固定值(编译整个设计的一部分,之前可以进行模拟)。
第二个错误是 SingleOneBit
模块 sob
的声明未定义 hte w
参数的结果。当您稍后使用 defparam
定义它时,您需要提供一些默认值 w
。您可以通过更改 w
的声明以包含默认值来在模块本身中执行此操作:
parameter integer w = 32'd5;
由于您似乎想测试此模块的各种宽度,我看不出有什么办法可以不声明此模块的多个宽度。当然,你可以使用一条generate语句来紧凑地生成这些不同宽度的模块;但我非常确定在模拟过程中没有任何方法可以更改参数。
编辑:
我忘了提到 defparam
结构可能会从语言中删除(IEEE1800-2009 和 IEEE1800-2012 都将其列为将来可能会被删除的内容),因此您应该避免使用它来允许您的代码与未来的工具兼容。
源代码:
module SingleOneBit(N,T);
parameter integer w; //width or number of inputs N
input wire [w-1:0] N;
output wire T;
wire[w*(w-1):0] N1; //for anding all possible combinations of 2 bits
wire R; // for oring all tha ands. If R = 1 then N contians more than one bit with value 1
wire RS; //ors all the bits of the input. Used for checking if there is one bit with value 1 or all 0s
wire R1; // not of R;
buf(R, 0); //initialy R should be 0;
buf(RS, 0); //initialy RS should be 0;
genvar i, j;
generate
for(i = 0; i<w; i=i+1) begin
or(RS,N[i],RS);
for(j = i+1; j<w; j=j+1) begin
and(N1[(i*w)+j], N[i], N[j]);
or(R,N1[(i*w)+j],R);
end
end
endgenerate
not(R1, R);
and(T,RS,R1);
endmodule
测试平台代码:
`include "C:/Users/Muaz Aljarhi/Google Drive/Muaz/Hardware_Designs/Verilog Course/SingleOneBit.v"
module SingleOneBit_tb();
integer n = 5;
reg[n-1:0] N;
wire T;
SingleOneBit sob(.N(N),.T(T));
defparam sob.w = n;
initial begin
$monitor("N = %b, T = %b",N,T);
end
endmodule
此 Verilog Testbench 代码的编译产生以下错误:
** Error: C:/Users/Muaz Aljarhi/Google Drive/Muaz/Hardware_Designs/Verilog Course/SingleOneBit_tb.v(7): Range must be bounded by constant expressions. ** Error: C:/Users/Muaz Aljarhi/Google Drive/Muaz/Hardware_Designs/Verilog Course/SingleOneBit_tb.v(11): Right-hand side of defparam must be constant.
如何声明一个可以在测试台中改变的变量或常量表达式?我尝试使用参数,但参数不是可以更改的变量。提前致谢
编辑:我是否必须使用可能不同的输入 reg 变量来声明模块的不同实例化,还是有其他方法?
我也试过这个:
SingleOneBit sob(.N(N[0]),.T(T));
defparam sob.w = 32'd5;
但是模拟,使用 modelsim 产生以下结果:
# ** Error: (vopt-2293) The parameter 'w' in the instance ('/SingleOneBit_tb/sob') of ('SingleOneBit') is declared without a value,
#
# and the instantiation does not provide a value for this parameter.
如何避免在模拟时出现这个错误?再次感谢。
编译器在模块实例化时需要一些参数值。 在 "SingleOneBit" 中提供默认参数值,如下所示:
parameter integer w= 12345;
稍后您可以使用 "defparam" 更改它。
或者你可以像这样在实例化表达式中设置参数:
SingleOneBit #(12345) sob(.N(N[0]),.T(T));
由于参数是编译时(技术上详细说明时)常量,您不能在执行过程中更改它们。因此,sob.w
设置为 n
的第一个错误是无效的,因为 n
在细化阶段无法确定为固定值(编译整个设计的一部分,之前可以进行模拟)。
第二个错误是 SingleOneBit
模块 sob
的声明未定义 hte w
参数的结果。当您稍后使用 defparam
定义它时,您需要提供一些默认值 w
。您可以通过更改 w
的声明以包含默认值来在模块本身中执行此操作:
parameter integer w = 32'd5;
由于您似乎想测试此模块的各种宽度,我看不出有什么办法可以不声明此模块的多个宽度。当然,你可以使用一条generate语句来紧凑地生成这些不同宽度的模块;但我非常确定在模拟过程中没有任何方法可以更改参数。
编辑:
我忘了提到 defparam
结构可能会从语言中删除(IEEE1800-2009 和 IEEE1800-2012 都将其列为将来可能会被删除的内容),因此您应该避免使用它来允许您的代码与未来的工具兼容。