我可以在一个整数的帮助下给另一个整数赋值吗?



我正在研究一个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

相关内容

最新更新