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

Материал из Модулярная арифметики
Перейти к: навигация, поиск
Строка 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);
Строка 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

Модули для эксперимента

Результаты

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