Verilog:在 for 循环中分配命名生成循环的连线
Verilog: Assigning a named generate loop's wire inside a for-loop
我收到一个我不理解的语法错误。似乎 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] = clocks[k].clk_slow;
尝试将这 4 个时钟分配给一个不同的 LED(led[7:4]
)。
错误是抱怨 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 {';', '[', '<=', '*', '+', '-', '?', '&', '|', '^', '~^', '^~', '/', '%', '==', '!=', '===', '!==', '&&', '||', '**', '<', '>', '>=', '>>', '<<', '>>>', '<<<'}
我还应该提到 led[4+k] = clocks[0].clk_slow
没问题。它让我可以 led[4+k] = clocks[0].clk_slow
,但不能 led[4+k] = clocks[k].clk_slow
。
您已将 led[i]
分配给 clk_slow
,为什么不能将 led[i]
也分配给 led[4+i]
?或者甚至 led[7:4]
到 led[3:0]
在生成块之外(和沟渠 clk_slow
,做 .clk_out(led[i])
)?此外,您无法连接 wire
输入 always@(*)
,使用 assign
.
I should also mention that led[4+k] = clocks[0].clk_slow is okay. It lets me do led[4+k] = clocks[0].clk_slow, but not led[4+k] = clocks[k].clk_slow
使用的时钟名称必须与常量变量一起使用,并且不能在 for 循环内变化。所以 clocks[0] 工作得很好。
生成块展开,用文字数字替换 'k'。它类似于宏文本扩展。您生成的块被扩展为
<code>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;
<code>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;
<code>generate
for( k = 0; k < 4; k=k+1) begin
assign led [ 4 + k ] = clocks[k].clock_slow;
end
endgenerate
另外,led 被声明为没有值的导线。但是你已经使用了 led in always 块来存储值。如果您在任何其他模拟器中 运行 也会出现错误。
谢谢,这是一个很好的问题。
我收到一个我不理解的语法错误。似乎 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] = clocks[k].clk_slow;
尝试将这 4 个时钟分配给一个不同的 LED(led[7:4]
)。
错误是抱怨 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 {';', '[', '<=', '*', '+', '-', '?', '&', '|', '^', '~^', '^~', '/', '%', '==', '!=', '===', '!==', '&&', '||', '**', '<', '>', '>=', '>>', '<<', '>>>', '<<<'}
我还应该提到 led[4+k] = clocks[0].clk_slow
没问题。它让我可以 led[4+k] = clocks[0].clk_slow
,但不能 led[4+k] = clocks[k].clk_slow
。
您已将 led[i]
分配给 clk_slow
,为什么不能将 led[i]
也分配给 led[4+i]
?或者甚至 led[7:4]
到 led[3:0]
在生成块之外(和沟渠 clk_slow
,做 .clk_out(led[i])
)?此外,您无法连接 wire
输入 always@(*)
,使用 assign
.
I should also mention that led[4+k] = clocks[0].clk_slow is okay. It lets me do led[4+k] = clocks[0].clk_slow, but not led[4+k] = clocks[k].clk_slow
使用的时钟名称必须与常量变量一起使用,并且不能在 for 循环内变化。所以 clocks[0] 工作得很好。
生成块展开,用文字数字替换 'k'。它类似于宏文本扩展。您生成的块被扩展为
<code>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;
<code>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;
<code>generate
for( k = 0; k < 4; k=k+1) begin
assign led [ 4 + k ] = clocks[k].clock_slow;
end
endgenerate
另外,led 被声明为没有值的导线。但是你已经使用了 led in always 块来存储值。如果您在任何其他模拟器中 运行 也会出现错误。
谢谢,这是一个很好的问题。