我正在研究一个Verilog模块,我想添加一个能够通过频率值改变的时钟。我尝试将两个变量引用为整数,为第一个变量[frequency]分配一个与频率值(以MHz为单位)对应的数字,并使用该变量的名称进行数学运算以获得第二个变量[clk_period]的值。但它不让我。
我有以下代码:
integer frequency = 100; //in MHz
integer clk_period = (1/(frequency*1e6))*1e9; // 1/freq = clk_prd (in seconds) * 10^9 (in nanoseconds)
,这是我得到的错误:
error: A reference to a wire or reg (`frequency') is not allowed in a constant expression.
我没有引用"频率"作为一个线或一个reg,而不是整数。这个特性(使用一个整数给另一个整数赋值)不可用,还是我在这里做错了什么?
哪个工具产生错误消息。我在eda playground上试过,它在所有商业模拟器上都能工作。
注意,这样的变量初始化是不可合成的。有fpga挂钩允许这样做,但这些是有限的。那么,你的信息是由合成工具生成的吗?
可能你可以把你的"频率"变成一个常数。理论上,这应该可以解决'常量表达式'的问题。
parameter frequency = 100;
integer clk_period = (1/(frequency*1e6))*1e9;
如果您将其用于testbench,只需将所有内容放在初始块中。这可能适用于fpga。
integer frequency; // or parameter frequency = 100;
integer clk_period;
initial begin
frequency = 100; // do not need wit parameter
clk_period = (1/(frequency*1e6))*1e9;
end
或者如果你想让它真正的可合成,像下面这样的东西可以工作。
parameter frequence = 100;
...
always @(posedge clk)
if (reset)
clk_period <= (1/(frequency*1e6))*1e9;
iverilog
模拟器告诉您,它不支持在同一语句中声明和分配这些类型。
你可以把它们分成两个语句:
integer clk_period;
initial clk_period = (1/(frequency*1e6))*1e9; // 1/freq = clk_prd (in seconds) * 10^9 (in nanoseconds)
这适用于EDA Playground