【问题标题】:Verilog: Assigning a named generate loop's wire inside a for-loopVerilog:在for循环中分配一个命名的生成循环的线
【发布时间】:2018-06-14 02:54:26
【问题描述】:

我收到一个我不理解的语法错误。似乎 Verilog 对索引在某种意义上是一个变量很挑剔,但我不确定这里到底发生了什么,或者如何在没有硬编码的情况下绕过它。

这是我的主要模块:

module mojo_top(
    // 50MHz clock input
    input clk,
    // Input from reset button (active low)
    input rst_n,
    // cclk input from AVR, high when AVR is ready
    input cclk,
    // Outputs to the 8 onboard LEDs
    output[7:0]led,
    // AVR SPI connections
    output spi_miso,
    input spi_ss,
    input spi_mosi,
    input spi_sck,
    // AVR ADC channel select
    output [3:0] spi_channel,
    // Serial connections
    input avr_tx, // AVR Tx => FPGA Rx
    output avr_rx, // AVR Rx => FPGA Tx
    input avr_rx_busy // AVR Rx buffer full

    );

// these signals should be high-z when not used
assign spi_miso = 1'bz;
assign avr_rx = 1'bz;
assign spi_channel = 4'bzzzz;

wire rst = ~rst_n; // make reset active high

genvar i;
generate
  for (i=0; i<4; i=i+1) begin: clocks
    wire clk_slow;
    slow_clock #(.FREQ(2**i)) clk1 (
      .clk(clk),
      .rst(rst),
      .clk_out(clk_slow)
    );
    assign led[i] = clk_slow;
  end
endgenerate

always @(*) begin
  for (k=0; k<4; k=k+1) begin
    assign led[4+k] = clocks[k].clk_slow; // Why can't I do this?
  end
end

endmodule

我正在生成 4 个时钟(1Hz、2Hz、4Hz 和 8Hz)。在最后的始终块中,我有这行:led[4+k] = clocks[k].clk_slow; 尝试将这 4 个时钟分别分配给不同的 LED(@ 987654323@)。 错误是在clocks[k] 之后抱怨.。我想知道我是否不允许在右侧有一个变量索引,但是当我只输入led[4+k] = clocks[k] 时,没有语法错误(尽管在我构建它时显然会出现不同的错误)。

为什么我可以拥有led[4+k] = clocks[k] 而不是led[4+k] = clocks[k].clk_slow?我应该用不同的语法来做到这一点吗?像我这里那样用for循环来做这件事是不可能的吗?

编辑: 如果有人想知道,这是我得到的具体错误。同样,它看起来只是在抱怨我在索引了我想要的特定生成块后做了任何事情。

Line 46, Column 24 : extraneous input '.' expecting {';', '[', '&lt;=', '*', '+', '-', '?', '&amp;', '|', '^', '~^', '^~', '/', '%', '==', '!=', '===', '!==', '&amp;&amp;', '||', '**', '&lt;', '&gt;', '&gt;=', '&gt;&gt;', '&lt;&lt;', '&gt;&gt;&gt;', '&lt;&lt;&lt;'}

我还应该提到led[4+k] = clocks[0].clk_slow 没问题。它让我可以led[4+k] = clocks[0].clk_slow,但不能led[4+k] = clocks[k].clk_slow

【问题讨论】:

    标签: verilog fpga


    【解决方案1】:

    我还应该提到 led[4+k] = clocks[0].clk_slow 是可以的。它让我可以做 led[4+k] = clocks[0].clk_slow,但不能让我做 led[4+k] = clocks[k].clk_slow

    使用的时钟名称必须与常量变量一起使用,并且不能在 for 循环内变化。所以时钟[0] 工作得很好。

    生成块被展开,用文字数字替换“k”。它类似于宏文本扩展。你生成的块被扩展成

        begin : clocks[0]
            wire clock_slow;
            assign led[0] = clocks[0].clock_slow;
        end
        begin : clocks[1]
            wire clock_slow;
            assign led[1] = clocks[1].clock_slow;
        end
        begin : clocks[2]
            wire clock_slow;
            assign led[2] = clocks[2].clock_slow;
        end
        ...
    

    请注意,线 clock_slow 不会变成线数组。相反,它变成了一组名为clocks[0].clock_slow、clocks[1].clock_slow、...的命名线,您只能通过指定具有常量索引的a 来访问它们。这是因为范围数组不像常规数组。每个实例可以包含不同的类型。例如:

    genvar i;
    for (i = 0; i < MAX_LIMIT; i++) begin: a
        wire [i+1:0] clock_slow;
    end
    

    a[0].clock_slow 是 2 位线,a[1].clock_slow 是 3 位线。所以引用 a[i].clock_slow 不会编译。但是您可以使用另一个生成块 genvar 来索引到另一个生成的块实例。

    例如:

    genvar k;
    generate
        for( k = 0; k < 4; k=k+1) begin
          assign led [ 4 + k ] = clocks[k].clock_slow;
        end
    endgenerate
    

    led 也被声明为不包含值的导线。但是您已经使用了 led in always 块来存储该值。如果您在任何其他模拟器中运行,这也会报错。

    谢谢,这是个好问题。

    【讨论】:

    • 很好的解释,谢谢。为什么我们可以在生成块内访问clocks[k].clock_slow?正如您所说,仍然不能保证clocks 范围数组中的每个元素都有clock_slow 线。这是否只是意味着在生成块中,它的限制较少,我最终可能会尝试访问不存在的东西?
    • 我也尝试使用第二个生成循环,如你所说,但我遇到了同样的问题。即使在生成块中,我也无法访问clocks[k].clock_slow
    【解决方案2】:

    您已将led[i] 分配给clk_slow,为什么不能也将led[i] 分配给led[4+i]?甚至led[7:4]led[3:0] 在生成块之外(和沟clk_slow,做.clk_out(led[i]))?另外,无法连接wire 输入always@(*),使用assign

    【讨论】:

    • 感谢您发现分配问题! :) 我知道我可以在生成循环内分配 led[7:4] 或将其分配给在生成循环外与 led[3:0] 的现有连接。但我的问题更多是关于为什么不允许使用那一行代码。
    • 错误说明了什么? led[4+k] = clocks[k] 没有意义(将生成块分配给 1 位线???),您确定可以拥有吗?
    • 哈哈我知道这没有意义,但从语法上讲,它显然可以检查出来,而将电线分配给 LED 并没有检查出来。这就是我很好奇的地方。我在我的问题中添加了具体错误。
    • 但是是的,我知道将生成块分配给 1 位线路是没有意义的。我的问题是:为什么我不能将生成块中的线分配给 1 位线?
    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多