Verilog:在for循环中指定命名的generate循环的连线

Verilog:在for循环中指定命名的generate循环的连线,verilog,fpga,Verilog,Fpga,我得到一个语法错误,我不明白。从某种意义上说,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 i

我得到一个语法错误,我不明白。从某种意义上说,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。在最后的always块中,我有一行:led[4+k]=时钟[k]。clk_slow;尝试将这4个时钟分别分配给不同的led[7:4]。 错误在于抱怨错误。时钟后[k]。我想知道我是否不允许在右边有一个变量索引,但是当我把led[4+k]=clocks[k]放在右边时,没有语法错误,尽管当我构建它时,它显然会得到不同的错误

为什么我可以有led[4+k]=时钟[k],但没有led[4+k]=时钟[k]。时钟慢?我应该用不同的语法来做吗?像我在这里做的那样,用for循环是不可能的吗

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

第46行,第24列:无关输入“'应为“{”;”、“[”、“=”、“>>”、“>>”、“您已将led[i]分配给clk_slow,为什么您不能同时将led[i]分配给led[4+i]?或者甚至将led[7:4]分配给led[3:0],在生成块外,并将clk_slow删除?clk_outled[i]?此外,您不能将导线类型始终连接到@*,请使用assign

我还应该提到led[4+k]=时钟[0]。时钟慢可以。它允许我执行led[4+k]=时钟[0]。时钟慢,但不是led[4+k]=时钟[k]。时钟慢

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

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

请注意,wire clock\u slow并不是一个导线数组。相反,它变成了一组名为clocks[0]的命名导线。clock\u slow,clocks[1]。clock\u slow,…只能通过指定一个具有常量索引的来访问。这是因为中的作用域数组与常规数组不同。每个实例可以包含不同的类型。例如:

a[0]。clock_slow是一条2位连线,a[1]。clock_slow是一条3位连线。因此,引用[i]。clock_slow不会编译。但您可以使用另一个generate block genvar索引到另一个生成的块实例中

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

另外,led被声明为不包含值的导线。但是您在存储值的always块中使用了led。如果您在任何其他模拟器中运行,这也会给出一个错误


谢谢,这是一个很好的问题。

谢谢你抓住了分配问题!:我知道我可以在生成循环内分配led[7:4],或者将其分配到生成循环外的led[3:0]的现有连接。但我的问题更多的是为什么不允许这一行代码。错误是什么?led[4+k]=时钟[k]没有意义将生成块分配给1位导线???,你确定你可以得到吗?哈哈,我知道这没有意义,但从语法上讲,它显然是检测出来的,而将导线分配给led则没有检测出来。这就是我好奇的地方。我在我的问题中添加了具体的错误。但是,是的,我知道这没有意义e将生成块分配给1位导线。我的问题是:为什么我不能将生成块中的导线分配给1位导线?非常好的解释,谢谢。为什么允许我们访问时钟[k].clock_slow在生成块中?根据你所说的,仍然不能保证作用域的clocks数组中的每个元素都会有一个clock_slow连线。这是否意味着在生成块中,它的限制性更小,我可能会尝试访问不存在的东西?我还尝试使用第二个生成循环,正如你所说的,但我也有同样的问题。即使在生成块中,我也无法访问时钟[k]。时钟慢。
genvar i;
for (i = 0; i < MAX_LIMIT; i++) begin: a
    wire [i+1:0] clock_slow;
end
genvar k;
generate
    for( k = 0; k < 4; k=k+1) begin
      assign led [ 4 + k ] = clocks[k].clock_slow;
    end
endgenerate