【问题标题】:Verilog Testbench constant exp and pram compilation and simulation errorsVerilog Testbench 常量 exp 和 pram 编译和仿真错误
【发布时间】:2015-06-14 19:40:01
【问题描述】:

源代码:

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 代码会产生以下错误:

** 错误:C:/Users/Muaz Aljarhi/Google Drive/Muaz/Hardware_Designs/Verilog Course/SingleOneBit_tb.v(7):范围 必须以常量表达式为界。 ** 错误:C:/Users/Muaz Aljarhi/Google Drive/Muaz/Hardware_Designs/Verilog Course/SingleOneBit_tb.v(11): defparam 的右边必须是常数。

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

编辑:我是否必须使用可能不同的输入 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.

如何避免在模拟时出现此错误?再次感谢。

【问题讨论】:

    标签: verilog simulation hdl modelsim


    【解决方案1】:

    由于参数是编译时(技术上精化时)常量,因此您不能在执行过程中更改它们。因此,将sob.w 设置为n 的第一个错误无效,因为在细化阶段(编译整个设计的一部分,在可以进行仿真之前)无法确定n 是一个固定值。

    第二个错误是SingleOneBit模块sob的声明没有定义hte w参数的结果。当您稍后使用defparam 定义它时,您需要提供一些默认值w。您可以在模块本身中执行此操作,方法是更改​​ w 的声明以包含默认值:

    parameter integer w = 32'd5;
    

    由于您似乎想测试此模块的各种宽度,我看不到不声明此模块的多个宽度的方法。当然,你可以使用 generate 语句来紧凑地生成这些不同宽度的模块;但我很确定在模拟过程中没有任何方法可以更改参数。

    编辑: 我忘了提到 defparam 结构可能会从语言中删除(IEE1800-2009 和 IEEE1800-2012 都将它列为将来可能会被删除的东西),所以你应该避免使用它来允许你的代码与未来的工具兼容。

    【讨论】:

    • "整数 n = 5;"是编译时变量。我怀疑,它不能用作参数初始化器的原因是为了简化编译器的工作。
    • @AlexeyBirukov 是的,另外,如果编译器确实接受 n 作为 5,如果您在模拟过程中更改 n,它将无法更改位宽内部变量(即,允许参数随n 更改),所以最终会很混乱:)
    • 可以在模拟过程中改变这些吗?不知道。那么可能“genvar”是很好的替代品。
    • @AlexeyBirukov 您当然可以在模拟过程中更改整数,但不能更改参数
    【解决方案2】:

    编译器在模块实例化时需要一些参数值。 在“SingleOneBit”中提供默认参数值,如下所示:

    parameter integer w= 12345;
    

    稍后您可以使用“defparam”进行更改。

    或者你可以像这样在实例化表达式中设置参数:

    SingleOneBit #(12345) sob(.N(N[0]),.T(T));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多