2015-06-07 3 views
0

Я пытаюсь использовать бесконечный цикл for внутри оператора generate. Но проблема в том, что я не могу остановить ее или выйти из нее, используя какое-то условие. Я использовал «disable» и «break». Оба не работают.Выход из цикла внутри оператора генерации

Он показывает ошибку:

неожиданный маркер: «отключить»

Пожалуйста, помогите мне решить эту проблему или предложить альтернативу ему. Вот мой 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 

ответ

2

Verilog generate блок используется для описания физического оборудования. Таким образом, inifinite loop в блоке generate потребует бесконечных ресурсов.

Любой цикл for внутри инструкции generate должен иметь фиксированный и конечный размер, который может быть определен во время синтеза.

Помните, что HDL не выполняется последовательно, но описывает соединения между физическими схемами. Поскольку кажется, что вам нужен только один экземпляр модуля calb_top, вам не требуется ни блок generate, ни цикл for.


Edit: Поскольку вы намерены выполнить итерационный процесс, у вас есть два варианта, как и Грег отметил в своем комментарии ниже - вы можете создать экземпляр фиксированного количества calb_top блоков (так как бесконечное число потребует бесконечного пространства) или повторного использования одного и того же блока несколько раз.

Вот несколько примеров. Я их не синтезировал или не синтезировал, но они логически правильны.

N-Блок Раствор

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 в список портов.

+0

Хорошо, я понял. Но я не хочу только одного экземпляра модуля calb_top, вместо этого я хочу продолжать генерировать его экземпляры, пока ошибка не станет равной нулю. Эта ошибка является результатом модуля calb_top, который я использую как условие для выхода из цикла. – vishi

+1

, когда 'error' равен нулю, какие сигналы вы хотите захватить?Кроме того, что такое прототип для 'calb_top' (какие сигналы являются' input 'vs' output ')? – wilcroft

+2

@vishi. Вы не можете генерировать экземпляры модулей, пока 'error' не будет равен нулю. 'generate' должен статически разворачиваться во время компиляции. 'error' не будет оцениваться до моделирования. Вы должны создать достаточно «calb_top» для решения наихудшего сценария. В худшем случае может потребоваться необоснованное количество аппаратного обеспечения, и большая часть логики будет использоваться. Использование последовательной логики позволит повторно использовать экземпляр 'calb_top', поместив обратную связь. – Greg

Смежные вопросы