【问题标题】: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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-26
        • 1970-01-01
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        相关资源
        最近更新 更多