Verilog测试台常数exp和pram编译和模拟错误

Verilog测试台常数exp和pram编译和模拟错误,verilog,simulation,hdl,modelsim,Verilog,Simulation,Hdl,Modelsim,源代码: 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 cont

源代码:

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 
编译此Verilog测试台代码会导致以下错误:

**错误:C:/Users/Muaz-Aljarhi/Google-Drive/Muaz/Hardware\u Designs/Verilog-Course/SingleOneBit\u-tb.v(7):范围 必须由常量表达式限定。 **错误:C:/Users/Muaz-Aljarhi/Google-Drive/Muaz/Hardware\u Designs/Verilog-Course/SingleOneBit\u-tb.v(11): defparam的右侧必须为常量

如何声明可以在测试台架内更改的变量或常量表达式?我尝试使用参数,但参数不是可以更改的变量。提前谢谢

编辑:我是否必须使用可能不同的输入变量声明模块的不同实例化,或者有其他方法

我也试过:

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;
SingleOneBit #(12345) sob(.N(N[0]),.T(T));
稍后您可以使用“defparam”进行更改

也可以在实例化表达式中设置如下参数:

parameter integer w= 12345;
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
结构可能会从语言中删除(IEE1800-2009和IEEE1800-2012都将其列为将来可能会删除的内容),因此您应该避免使用它以使代码与将来的工具兼容。

“integer n=5;”是编译时变量。正如我所怀疑的,它不能用作参数初始化器是为了简化编译器的工作。@ AlxyByukOV-YUP,而且,如果编译器接受了<代码> N< /代码> 5,如果在模拟过程中更改<代码> N< /代码>,它将不能改变内部变量的位宽度。(也就是说,允许参数随
n
)更改,因此最终会变得非常混乱:)可以在模拟过程中更改这些参数吗?我不知道。那么,“genvar”可能是一个很好的替代品。@AlexeyBirukov您当然可以在模拟过程中更改整数,但不能更改参数