Частота множителя Монтгомери
Я разработал множитель 16*16 Монтгомери. Код использует множитель 16*16 для выполнения трех умножений. Умножения выполняются одно за другим с использованием одного и того же умножителя, и результат каждого умножения сохраняется в регистрах. Одиночный множитель 16*16 работает на частоте около 1550 МГц, но частота умножителя Монтгомери (который использует один множитель 16*16 три раза) уменьшается до почти 500 МГц, когда три умножения выполняются последовательно. Я хочу избежать снижения частоты и хочу работать на частоте одного умножителя. Нужна помощь в этом.
Код предоставляется вместе с. (В данном случае предоставляются только умножения. Дополнения, сдвиг был исключен для простоты)
`define m 11
`define mbar 245
module test_mul(a,b,clk,reg2,reset);
input [15:0] a,b;
input clk,reset;
output reg [31:0] reg2;
reg [15:0] x,y;
reg [31:0] reg0,reg1;
reg [5:0] count;
wire [31:0]p;
test_mul16 a1 (x,y,clk, p);
always @ (posedge clk)
begin
if (reset)
begin x <= a; y <= b; count= 6'd0 end
else begin
if (count == 11)
reg2 <= p;
if (count == 12)
begin x <= reg0[15:0]; y <=`mbar; end
if (count == 27)
reg1 <= p;
else if (count == 28)
begin
x <= reg1[15:0];
y <= `m;
end
else if (count == 39)
begin
reg2 <= p;
end
count = count+1;
end
end
endmodule
module test_mul16(a,b,clk,reg2);
input [15:0] a,b;
input clk;
output reg [31:0] reg2;
reg [31:0] reg0, reg1;
always @ (posedge clk)
begin
reg0<= a*b;
reg1<=reg0;
reg2<=reg1;
end
endmodule
1 ответ
Итак, основываясь на комментарии, в котором Хида говорит, что это проблема времени, я думаю, что здесь может произойти пара вещей. Я могу помочь вам улучшить синхронизацию, но я не уверен, что мы сможем получить 1,5 ГГц. Вы должны сообщить нам, какого поставщика вы тоже используете.
У вас есть if со сбросом, но вы не сбрасываете все переменные. Это нормально, если вы знаете, что у вас ничего не инициализировано. Но реальная вещь заключается в том, что многие новые технологии FPGA не хотят, чтобы вы использовали сброс, если вам не нужно. Я замечаю, что вы сбрасываете x и y со входами a и b. Вы должны сделать это? Если вам не нужно сбрасывать x и y на a и b соответственно, вы можете удалить их из сброса, и это поможет улучшить время.
Ваш конечный автомат (с использованием переменной состояния) не один горячий. Вы можете взглянуть на кодирование, чтобы использовать один горячий, и это даст вам небольшой импульс.
Для этого сделайте подсчет 40-битных регистров, сбросьте его на 40'h00001, а затем по таймеру присвойте ему такой счет<= {count[38:0],count[39]}; затем используйте отдельный бит для запуска вашей логики.
Затем взгляните на свои "если". У вас есть несколько разовых "если". В некоторых случаях у вас есть несколько if, присваивающих одну и ту же переменную. Это, вероятно, хорошо, но синтезатору, вероятно, придется кое-что проработать, и это может быть не так эффективно, как могло бы быть, если бы вы кодировали его по-другому. Попробуйте использовать регистр. Если вы последуете одному горячему предложению, приведенному выше, ваши заявления будут похожи на этот случай (количество) 40'd11: начать делать что-то конец 40'd12: начать делать что-то другое конец и т.д.... endcase
Наконец, также в ваших IF, у вас есть, если и если еще происходит. Получите их в этом случае выше, потому что вы в основном присваиваете приоритеты счетам 27, 28 и 39. Для одной переменной между значениями может и не должно быть приоритета. Значение равно 27, 28 или 39, или что-то еще, и у логики никогда не будет случая выбрать одно состояние из другого.
Если вы сделаете некоторые из этих изменений, ваша скорость должна возрасти. Хотелось бы знать, какой поставщик говорит, что вы достигли 1,5 ГГц.