在generate语句中退出for循环

时间:2015-06-07 11:10:00

标签: verilog

我正在尝试在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

1 个答案:

答案 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,则a1a3将用作输入。否则,将使用先前的输出alpha1alpha3。当error为0时,则设置dtot。请注意,我已将clockstart添加到端口列表中。