Сравнение разных методов умножения по модулю — различия между версиями

Материал из Модулярная арифметики
Перейти к: навигация, поиск
 
(не показано 5 промежуточных версии этого же участника)
Строка 1: Строка 1:
 
Было произведено сравнение позиционного, индексного умножителя и умножителя по методу разности квадратов (далее DS-умножитель).
 
Было произведено сравнение позиционного, индексного умножителя и умножителя по методу разности квадратов (далее DS-умножитель).
Сравнение производилось для чисел с разрядность от 2 до 9 бит.
+
Сравнение производилось для модулей с разрядностью от 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]]
* [http://vscripts.ru/res/files/Graph-Std-Multiplication.xlsx Скачать Excel-файл с численными данными]
+
 
 +
[[Категория:Результаты]]

Текущая версия на 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

Результаты

Ds index position timing.png Ds index position area.png Ds index position power.png