我正在尝试在generate语句中使用无限循环。但问题是我无法阻止它或使用某些条件退出它。我用“禁用”和“休息”。两者都不起作用。
显示错误:
意外令牌:'禁用'
请帮我解决这个问题或建议替代它。这是我的Verilog代码:
module top(a1,a3,wj,d4,d10,d2,dc,dtot);
input [11:0]a1,a3,wj;
input [3:0]d4;
input [9:0]d10;
input [1:0]d2;
input [25:0]dc;
output reg[25:0]dtot;
reg [25:0]dt,error;
reg [11:0]alpha1,alpha3;
genvar i;
generate
for (i=1;i>0;i=i+1-1)begin:test
assign a1[11:0]=alpha1[11:0];
assign a3[11:0]=alpha3[11:0];
calb_top t1(a1,a3,wj,d4,d10,d2,dc,dt,error,alpha1,alpha3);
if(error==26'b00000000000000000000000000)begin
disable test;
//break;
end
end
endgenerate
assign dtot=dt;
endmodule
答案 0 :(得分:2)
Verilog generate
块用于描述物理硬件。因此,generate
块中的无限循环将需要无限的资源。
for
语句中的任何generate
循环必须具有可在合成期间确定的固定且有限的大小。
请记住,HDL不是按顺序执行的,而是描述物理电路之间的连接。由于您似乎只需要calb_top
模块的一个实例,因此您不需要generate
块或for
循环。
修改强>
由于你打算执行一个迭代过程,你有两个选择,正如Greg在下面的评论中指出的那样 - 你可以实例化固定数量的calb_top
块(因为无限数量需要无限量的空间)或重复使用相同的块数次。
以下是一些样本。我没有模拟或合成它们,但它们在逻辑上是正确的。
N-Block解决方案
module top(a1,a3,wj,d4,d10,d2,dc,dtot,clock,done);
parameter NUM_BLOCKS = 10;
input [11:0]a1,a3,wj;
input [3:0]d4;
input [9:0]d10;
input [1:0]d2;
input [25:0]dc;
output [25:0]dtot;
wire [11:0] a1s [NUM_BLOCKS:0];
wire [11:0] a3s [NUM_BLOCKS:0];
wire [25:0] dt [NUM_BLOCKS-1:0];
wire [25:0] error [NUM_BLOCKS-1:0];
assign a1s[0]=a1;
assign a3s[0]=a3;
genvar i;
generate
for (i=0;i<NUM_BLOCKS;i=i+1)begin:test
calb_top t1(a1s[i],a3s[i],wj,d4,d10,d2,dc,dt[i],error[i],a1s[i+1],a3s[i+1]);
end
endgenerate
assign dtot=dt[NUM_BLOCKS-1];
endmodule
这会将多个calb_top
块链接到NUM_BLOCKS
,然后将最终块的结果输出到dtot
。这不会对错误进行任何检查,因此您可能需要输入自己的代码来检查error[NUM_BLOCKS-1]
(最终calb_top
的错误)。
单块解决方案:
module top(clock,start,a1,a3,wj,d4,d10,d2,dc,dtot);
input clock;
input start;
input [11:0]a1,a3,wj;
input [3:0]d4;
input [9:0]d10;
input [1:0]d2;
input [25:0]dc;
output reg[25:0]dtot;
wire [25:0]dt,error;
reg [11:0] a1in, a3in;
wire [11:0] alpha1,alpha3;
calb_top t1(a1in,a3in,wj,d4,d10,d2,dc,dt,error,alpha1,alpha3);
always @(posedge clock)
begin
if (start)
begin
a1in <= a1;
a3in <= a3;
end
else
begin
a1in <= alpha1;
a3in <= alpha3;
end
end
always @(posedge clock)
if (start)
dtot <= 0;
else if (error == 0)
dtot <= dt;
else
dtot <= dtot;
endmodule
每个时钟周期,我们运行一次calb_top
。如果start
为1,则a1
和a3
将用作输入。否则,将使用先前的输出alpha1
和alpha3
。当error
为0时,则设置dtot
。请注意,我已将clock
和start
添加到端口列表中。