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
в список портов.
Хорошо, я понял. Но я не хочу только одного экземпляра модуля calb_top, вместо этого я хочу продолжать генерировать его экземпляры, пока ошибка не станет равной нулю. Эта ошибка является результатом модуля calb_top, который я использую как условие для выхода из цикла. – vishi
, когда 'error' равен нулю, какие сигналы вы хотите захватить?Кроме того, что такое прототип для 'calb_top' (какие сигналы являются' input 'vs' output ')? – wilcroft
@vishi. Вы не можете генерировать экземпляры модулей, пока 'error' не будет равен нулю. 'generate' должен статически разворачиваться во время компиляции. 'error' не будет оцениваться до моделирования. Вы должны создать достаточно «calb_top» для решения наихудшего сценария. В худшем случае может потребоваться необоснованное количество аппаратного обеспечения, и большая часть логики будет использоваться. Использование последовательной логики позволит повторно использовать экземпляр 'calb_top', поместив обратную связь. – Greg