Сравнение разных методов умножения по модулю — различия между версиями
Материал из Модулярная арифметики
Turbo (обсуждение | вклад) |
|||
(не показано 5 промежуточных версии этого же участника) | |||
Строка 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); | ||
Строка 211: | Строка 211: | ||
report_area > area_<имя модуля>.rpt | report_area > area_<имя модуля>.rpt | ||
report_power -analysis_effort high > power_<имя модуля>.rpt | report_power -analysis_effort high > power_<имя модуля>.rpt | ||
− | remove_design | + | remove_design -all |
</pre> | </pre> | ||
+ | |||
+ | == Модули для эксперимента == | ||
+ | <table style='border: 1px solid black; text-align: center;'> | ||
+ | <tr> | ||
+ | <td style='border: 1px solid black; padding: 2px;'>Битность</td> | ||
+ | <td style='border: 1px solid black; padding: 2px;'>Модуль для индексного умножителя</td> | ||
+ | <td style='border: 1px solid black; padding: 2px;'>Модуль для DS умножителя</td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td style='border: 1px solid black;'>2</td> | ||
+ | <td style='border: 1px solid black;'>3</td> | ||
+ | <td style='border: 1px solid black;'>3</td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td style='border: 1px solid black;'>3</td> | ||
+ | <td style='border: 1px solid black;'>7</td> | ||
+ | <td style='border: 1px solid black;'>7</td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td style='border: 1px solid black;'>4</td> | ||
+ | <td style='border: 1px solid black;'>13</td> | ||
+ | <td style='border: 1px solid black;'>15</td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td style='border: 1px solid black;'>5</td> | ||
+ | <td style='border: 1px solid black;'>31</td> | ||
+ | <td style='border: 1px solid black;'>31</td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td style='border: 1px solid black;'>6</td> | ||
+ | <td style='border: 1px solid black;'>61</td> | ||
+ | <td style='border: 1px solid black;'>63</td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td style='border: 1px solid black;'>7</td> | ||
+ | <td style='border: 1px solid black;'>127</td> | ||
+ | <td style='border: 1px solid black;'>127</td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td style='border: 1px solid black;'>8</td> | ||
+ | <td style='border: 1px solid black;'>251</td> | ||
+ | <td style='border: 1px solid black;'>255</td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td style='border: 1px solid black;'>9</td> | ||
+ | <td style='border: 1px solid black;'>509</td> | ||
+ | <td style='border: 1px solid black;'>511</td> | ||
+ | </tr> | ||
+ | </table> | ||
== Результаты == | == Результаты == | ||
+ | * [http://vscripts.ru/res/files/Mul-Compare-2012.xls Скачать Excel-файл с численными данными] | ||
+ | * [http://vscripts.ru/res/files/Mul-Compare-2012-Results.zip Скачать результаты моделирования] | ||
+ | |||
[[Изображение:ds_index_position_timing.png]] | [[Изображение:ds_index_position_timing.png]] | ||
[[Изображение:ds_index_position_area.png]] | [[Изображение:ds_index_position_area.png]] | ||
[[Изображение:ds_index_position_power.png]] | [[Изображение:ds_index_position_power.png]] | ||
− | + | ||
+ | [[Категория:Результаты]] |
Текущая версия на 08:42, 20 февраля 2013
Было произведено сравнение позиционного, индексного умножителя и умножителя по методу разности квадратов (далее 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 -all
Модули для эксперимента
Битность | Модуль для индексного умножителя | Модуль для DS умножителя |
2 | 3 | 3 |
3 | 7 | 7 |
4 | 13 | 15 |
5 | 31 | 31 |
6 | 61 | 63 |
7 | 127 | 127 |
8 | 251 | 255 |
9 | 509 | 511 |