Всем привет,
есть незадачка - мой системверилог проект очень долго компилится (2-5 часов) и не всегда его fmax бывает приемлим.
Сам проект - всего-то около 600 строк без ниоса и наворотов, используется только мегафункции памяти (M9K, M144), altpll и altmult_add.
В самом проекте есть два параметра, назову из K и M, где K - это объем кольцевого буффера памяти, M - число использующихся умножителей.
Если K примерно 70% от всей доступной памяти, M - 10% от всех доступных умножителей, fmax на основной клок получается хороший (490МГц). Компилится все около часу на хорошем i5.
Если
1) K примерно 10-20% от всей доступной памяти, M - любое, или
2) K и M примерно по 30%,
fmax получается еще приемлимый, окло 400МГц (мне не меньше надо) но компилится уже около 2-5 часов.
Если я пытаюсь задействовать почти все умножители и хотя бы 70% памяти, то обычно квартус через 1-2 часа падает со своей какой-то внутренней ошибкой или через 5-7 часов все-таки заканчивает работу, но fmax получается очень маленьким - около 300МГц.
Алгоритмически все упирается в одну простую конструкцию:
Код
...
parameter N=42;
input Clk;
input [13:0] In[0:2];
...
reg signed [13:0] D[0:2][0:1];
reg signed [13:0] Data[0:2][0:N];
wire signed [31:0] ScalY[0:8][0:N-1];
...
// Generating modules
generate
genvar i, j, k;
for(i=0; i<N; i+=2) begin : aaa
for(j=0; j<3; j++) begin : bbb
for(k=0; k<3; k++) begin : ccc
MultOne MultOne_Module(Clk, D[j][0], D[j][1], Data[k][i], Data[k][i+1], Clk2, ScalY[j+3*k][i], ScalY[j+3*k][i+1]);
end end end
endgenerate
...
module MultOne(Clk, A1, A2, B1, B2, Clk2, Res1, Res2);
parameter SHR=18;
input Clk, Clk2;
input signed [13:0] A1, A2, B1, B2;
output reg signed [31:0] Res1, Res2;
reg signed [13:0] P1, P2, Q1, Q2;
reg signed [28:0] Sum;
reg signed [28:0] SumR0, SumR1, SumR2, SumDM0, SumDM1;
reg signed [28+SHR:0] ScalX1, ScalX2;
reg signed [31:0] Z_Res1, Z_Res2;
// Sum<=P1*Q1+P2*Q2;
my_madd my_madd_module(Clk, P1, Q1, P2, Q2, Sum);
always @(posedge Clk)
begin
P1<=A1;
P2<=A2;
Q1<=B1;
Q2<=B2;
SumR0<=Sum;
SumR1<=SumR0;
SumR2<=SumR1;
end
always @(posedge Clk2) // этот клок в два раза медленнее Clk
begin
SumDM0<=SumR1;
SumDM1<=SumR2;
ScalX1<=ScalX1+SumDM0-(ScalX1>>>SHR);
ScalX2<=ScalX2+SumDM1-(ScalX2>>>SHR);
Z_Res1<=ScalX1[28+SHR:SHR-3];
Z_Res2<=ScalX2[28+SHR:SHR-3];
Res1<=Z_Res1;
Res2<=Z_Res2;
end
endmodule
Как я понимаю, основная загвоздка у Квартуса возникает тогда, когда я пытаюсь поместить сотни дублей моего MultOne модуля (в мой кристал влазит 384) мне очень хочется вычислять при N=42, то есть когда задействовано 378 умножителей.
Теперь мой вопрос... Могу ли я как-то помочь квартусу, чтобы он стал быстрее компилировать, например, можно ли скомпилить сколько-то этих модулей и физически куда-то в кристалле разместить? Шаманил вокруг LogicLock Regions and Design Partitions Window, но, кажется так запутался, что ничего не могу поделать сам, поэтому прошу помощи у Вас!
Пожалуйста, посоветуйте, что мне сделать, чтобы увеличить fmax и не ждать по 5 часов на компиляцию этих нескольких строк кода!
ЗЫ: при компиляции в квартусе стоят все опции, которые ускоряют fmaxна основе адвизора! Если их отключать, компиляция конечно за пол часа заканчивается но и fmax даже до 200МГц не дотягивает!
Спасибо
И