Сравнение разных методов умножения по модулю — различия между версиями
Материал из Модулярная арифметики
Turbo (обсуждение | вклад) |
|||
Строка 1: | Строка 1: | ||
Было произведено сравнение позиционного, индексного умножителя и умножителя по методу разности квадратов (далее DS-умножитель). | Было произведено сравнение позиционного, индексного умножителя и умножителя по методу разности квадратов (далее DS-умножитель). | ||
− | Сравнение производилось для | + | Сравнение производилось для модулей с разрядностью от 2 до 9 бит. |
Запуск производился на Synopsys Design Compiler. | Запуск производился на Synopsys Design Compiler. | ||
== Типовые Verilog-модули == | == Типовые Verilog-модули == | ||
− | 1. Позиционный умножитель | + | 1. Позиционный умножитель (на примере 12-битного) |
<pre> | <pre> | ||
module dif_multipliers_12_12 (a,b,out); | module dif_multipliers_12_12 (a,b,out); | ||
Строка 14: | Строка 14: | ||
</pre> | </pre> | ||
− | 2. Индексный умножитель | + | 2. Индексный умножитель по модулю (на примере модуля 3) |
<pre> | <pre> | ||
module multiplication_mod_3(inp1, inp2, out); | module multiplication_mod_3(inp1, inp2, out); | ||
Строка 103: | Строка 103: | ||
</pre> | </pre> | ||
− | 3. DS-умножитель | + | 3. DS-умножитель (на примере модуля 3) |
<pre> | <pre> | ||
module multiplication_mod_3(inp1, inp2, out); | module multiplication_mod_3(inp1, inp2, out); | ||
Строка 213: | Строка 213: | ||
remove_design | remove_design | ||
</pre> | </pre> | ||
+ | |||
+ | == Модули для эксперимента == | ||
+ | |||
== Результаты == | == Результаты == |
Версия 07:47, 26 декабря 2012
Было произведено сравнение позиционного, индексного умножителя и умножителя по методу разности квадратов (далее DS-умножитель). Сравнение производилось для модулей с разрядностью от 2 до 9 бит. Запуск производился на Synopsys Design Compiler.
Содержание
Типовые Verilog-модули
1. Позиционный умножитель (на примере 12-битного)
module dif_multipliers_12_12 (a,b,out); output wire [23:0] out; input wire [11:0] a,b; assign out=a*b; endmodule
2. Индексный умножитель по модулю (на примере модуля 3)
module multiplication_mod_3(inp1, inp2, out); input [1:0] inp1; input [1:0] inp2; output reg [1:0] out; wire [1:0] out_pre; wire [1:0] w_1_0; wire [1:0] w_2_0; wire [1:0] wout_0; lut_input_3 lut1(inp1, w_1_0); lut_input_3 lut2(inp2, w_2_0); sum_modulo_2 sm0(w_1_0, w_2_0, wout_0); lut_output_3 lut3(wout_0, out_pre); always @ (*) begin if (inp1 == 0 || inp2 == 0) begin out = 0; end else begin out = out_pre; end end endmodule module sum_modulo_2(inp1, inp2, out); input [1:0] inp1; input [1:0] inp2; output reg [1:0] out; wire [2:0] int; assign int = inp1 + inp2; always @ (*) begin if (int < 2) begin out = int; end else begin out = int - 2; end end endmodule module lut_output_3(inp0, out); output reg [1:0] out; input [1:0] inp0; always @ (*) begin if (inp0 == 0) begin out <= 1; end else if (inp0 == 1) begin out <= 2; end else begin out <= 0; end end endmodule module lut_input_3(inp, out0); input [1:0] inp; output reg [1:0] out0; always @ (inp) begin case(inp) 1: begin out0 <= 0; end 2: begin out0 <= 1; end default: begin out0 <= 0; end endcase end endmodule
3. DS-умножитель (на примере модуля 3)
module multiplication_mod_3(inp1, inp2, out); input [1:0] inp1; input [1:0] inp2; output reg [1:0] out; wire [1:0] out_pre; wire [1:0] w_1_0; wire [1:0] w_2_0; wire [1:0] wout_0; lut_input_3 lut1(inp1, w_1_0); lut_input_3 lut2(inp2, w_2_0); sum_modulo_2 sm0(w_1_0, w_2_0, wout_0); lut_output_3 lut3(wout_0, out_pre); always @ (*) begin if (inp1 == 0 || inp2 == 0) begin out = 0; end else begin out = out_pre; end end endmodule module sum_modulo_2(inp1, inp2, out); input [1:0] inp1; input [1:0] inp2; output reg [1:0] out; wire [2:0] int; assign int = inp1 + inp2; always @ (*) begin if (int < 2) begin out = int; end else begin out = int - 2; end end endmodule module lut_output_3(inp0, out); output reg [1:0] out; input [1:0] inp0; always @ (*) begin if (inp0 == 0) begin out <= 1; end else if (inp0 == 1) begin out <= 2; end else begin out <= 0; end end endmodule module lut_input_3(inp, out0); input [1:0] inp; output reg [1:0] out0; always @ (inp) begin case(inp) 1: begin out0 <= 0; end 2: begin out0 <= 1; end default: begin out0 <= 0; end endcase end endmodule
Библиотека стандартных ячеек
NangateOpenCellLibrary_typical_conditional_nldm.lib
Скрипт для запуска
analyze -f verilog <имя модуля>.v elaborate <имя модуля> uniquify current_design <имя модуля> check_design set_load [load_of [get_lib_pins NangateOpenCellLibrary/INV_X4/A]] [all_outputs] set_driving_cell -lib_cell DFFRS_X2 -library NangateOpenCellLibrary -pin Q [all_inputs] set_max_delay -to [all_outputs] 0 set_max_area 0 compile report_timing -significant_digits 6 > timing_<имя модуля>.rpt report_area > area_<имя модуля>.rpt report_power -analysis_effort high > power_<имя модуля>.rpt remove_design