【问题标题】:Can I assign a value to an integer with the help of another integer?我可以在另一个整数的帮助下为一个整数赋值吗?
【发布时间】:2022-11-14 14:13:05
【问题描述】:
我正在开发一个 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.
我没有将“频率”引用为电线或调节器,而是整数。此功能(使用整数为另一个整数赋值)不可用,还是我在这里做错了什么?
【问题讨论】:
标签:
integer
verilog
iverilog
【解决方案1】:
哪个工具产生错误消息。我在 eda 操场上尝试过,它适用于所有商业模拟器。
请注意,像这样的 vars 的初始化是不可合成的。有允许它的 fpga 钩子,但这些钩子是有限的。那么,您的信息是由综合工具生成的吗?
潜在地,你可以让你的“频率”变成一个常数。从理论上讲,这应该解决“常量表达式”问题。
parameter frequency = 100;
integer clk_period = (1/(frequency*1e6))*1e9;
如果您将它用于测试台,只需将所有内容放入一个初始块中。这可能适用于 fpgas。
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;
【解决方案2】:
iverilog 模拟器告诉您它不支持在同一语句中声明和分配这些类型。
您可以将它们分成两个语句:
integer clk_period;
initial clk_period = (1/(frequency*1e6))*1e9; // 1/freq = clk_prd (in seconds) * 10^9 (in nanoseconds)
这适用于EDA Playground