diff options
Diffstat (limited to 'techlibs/ice40')
| -rw-r--r-- | techlibs/ice40/Makefile.inc | 1 | ||||
| -rw-r--r-- | techlibs/ice40/arith_map.v | 30 | ||||
| -rw-r--r-- | techlibs/ice40/cells_map.v | 23 | ||||
| -rw-r--r-- | techlibs/ice40/cells_sim.v | 16 | ||||
| -rw-r--r-- | techlibs/ice40/ice40_braminit.cc | 6 | ||||
| -rw-r--r-- | techlibs/ice40/ice40_opt.cc | 2 | ||||
| -rw-r--r-- | techlibs/ice40/ice40_unlut.cc | 106 | ||||
| -rw-r--r-- | techlibs/ice40/synth_ice40.cc | 15 | ||||
| -rw-r--r-- | techlibs/ice40/tests/test_arith.ys | 9 | ||||
| -rw-r--r-- | techlibs/ice40/tests/test_dsp_model.sh | 9 | ||||
| -rw-r--r-- | techlibs/ice40/tests/test_dsp_model.v | 225 | 
11 files changed, 278 insertions, 164 deletions
diff --git a/techlibs/ice40/Makefile.inc b/techlibs/ice40/Makefile.inc index d258d5a5d..76a89b107 100644 --- a/techlibs/ice40/Makefile.inc +++ b/techlibs/ice40/Makefile.inc @@ -4,7 +4,6 @@ OBJS += techlibs/ice40/ice40_braminit.o  OBJS += techlibs/ice40/ice40_ffssr.o  OBJS += techlibs/ice40/ice40_ffinit.o  OBJS += techlibs/ice40/ice40_opt.o -OBJS += techlibs/ice40/ice40_unlut.o  GENFILES += techlibs/ice40/brams_init1.vh  GENFILES += techlibs/ice40/brams_init2.vh diff --git a/techlibs/ice40/arith_map.v b/techlibs/ice40/arith_map.v index fe83a8e38..26b24db9e 100644 --- a/techlibs/ice40/arith_map.v +++ b/techlibs/ice40/arith_map.v @@ -44,35 +44,21 @@ module _80_ice40_alu (A, B, CI, BI, X, Y, CO);  	genvar i;  	generate for (i = 0; i < Y_WIDTH; i = i + 1) begin:slice -`ifdef _ABC -		\$__ICE40_FULL_ADDER carry ( +		\$__ICE40_CARRY_WRAPPER #( +			//    A[0]: 1010 1010 1010 1010 +			//    A[1]: 1100 1100 1100 1100 +			//    A[2]: 1111 0000 1111 0000 +			//    A[3]: 1111 1111 0000 0000 +			.LUT(16'b 0110_1001_1001_0110) +		) fadd (  			.A(AA[i]),  			.B(BB[i]),  			.CI(C[i]), -			.CO(CO[i]), -			.O(Y[i]) -		); -`else -		SB_CARRY carry ( -			.I0(AA[i]), -			.I1(BB[i]), -			.CI(C[i]), -			.CO(CO[i]) -		); -		SB_LUT4 #( -			//         I0: 1010 1010 1010 1010 -			//         I1: 1100 1100 1100 1100 -			//         I2: 1111 0000 1111 0000 -			//         I3: 1111 1111 0000 0000 -			.LUT_INIT(16'b 0110_1001_1001_0110) -		) adder (  			.I0(1'b0), -			.I1(AA[i]), -			.I2(BB[i]),  			.I3(C[i]), +			.CO(CO[i]),  			.O(Y[i])  		); -`endif  	end endgenerate  	assign X = AA ^ BB; diff --git a/techlibs/ice40/cells_map.v b/techlibs/ice40/cells_map.v index b4b831165..662423f0a 100644 --- a/techlibs/ice40/cells_map.v +++ b/techlibs/ice40/cells_map.v @@ -62,26 +62,21 @@ module \$lut (A, Y);  endmodule  `endif -`ifdef _ABC -module \$__ICE40_FULL_ADDER (output CO, O, input A, B, CI); +`ifndef NO_ADDER +module \$__ICE40_CARRY_WRAPPER (output CO, O, input A, B, CI, I0, I3); +  parameter LUT = 0;    SB_CARRY carry (      .I0(A),      .I1(B),      .CI(CI),      .CO(CO)    ); -  SB_LUT4 #( -    //         I0: 1010 1010 1010 1010 -    //         I1: 1100 1100 1100 1100 -    //         I2: 1111 0000 1111 0000 -    //         I3: 1111 1111 0000 0000 -    .LUT_INIT(16'b 0110_1001_1001_0110) -  ) adder ( -    .I0(1'b0), -    .I1(A), -    .I2(B), -    .I3(CI), -    .O(O) +  \$lut #( +    .WIDTH(4), +    .LUT(LUT) +  ) lut ( +    .A({I0,A,B,I3}), +    .Y(O)    );  endmodule  `endif diff --git a/techlibs/ice40/cells_sim.v b/techlibs/ice40/cells_sim.v index 609facc93..2205be27d 100644 --- a/techlibs/ice40/cells_sim.v +++ b/techlibs/ice40/cells_sim.v @@ -1363,13 +1363,13 @@ module SB_MAC16 (  	wire [15:0] p_Ah_Bh, p_Al_Bh, p_Ah_Bl, p_Al_Bl;  	wire [15:0] Ah, Al, Bh, Bl;  	assign Ah = {A_SIGNED ? {8{iA[15]}} : 8'b0, iA[15: 8]}; -	assign Al = {A_SIGNED ? {8{iA[ 7]}} : 8'b0, iA[ 7: 0]}; +	assign Al = {A_SIGNED && MODE_8x8 ? {8{iA[ 7]}} : 8'b0, iA[ 7: 0]};  	assign Bh = {B_SIGNED ? {8{iB[15]}} : 8'b0, iB[15: 8]}; -	assign Bl = {B_SIGNED ? {8{iB[ 7]}} : 8'b0, iB[ 7: 0]}; -	assign p_Ah_Bh = Ah * Bh; -	assign p_Al_Bh = Al * Bh; -	assign p_Ah_Bl = Ah * Bl; -	assign p_Al_Bl = Al * Bl; +	assign Bl = {B_SIGNED && MODE_8x8 ? {8{iB[ 7]}} : 8'b0, iB[ 7: 0]}; +	assign p_Ah_Bh = Ah * Bh; // F +	assign p_Al_Bh = {8'b0, Al[7:0]} * Bh; // J +	assign p_Ah_Bl = Ah * {8'b0, Bl[7:0]}; // K +	assign p_Al_Bl = Al * Bl; // G  	// Regs F and J  	reg [15:0] rF, rJ; @@ -1400,7 +1400,9 @@ module SB_MAC16 (  	assign iG = BOT_8x8_MULT_REG ? rG : p_Al_Bl;  	// Adder Stage -	assign iL = iG + (iK << 8) + (iJ << 8) + (iF << 16); +	wire [23:0] iK_e = {A_SIGNED ? {8{iK[15]}} : 8'b0, iK}; +	wire [23:0] iJ_e = {B_SIGNED ? {8{iJ[15]}} : 8'b0, iJ}; +	assign iL = iG + (iK_e << 8) + (iJ_e << 8) + (iF << 16);  	// Reg H  	reg [31:0] rH; diff --git a/techlibs/ice40/ice40_braminit.cc b/techlibs/ice40/ice40_braminit.cc index 4fa6b0792..1a139ffea 100644 --- a/techlibs/ice40/ice40_braminit.cc +++ b/techlibs/ice40/ice40_braminit.cc @@ -69,13 +69,13 @@ static void run_ice40_braminit(Module *module)  			for (int i = 0; i < GetSize(line); i++)  			{ -				if (in_comment && line.substr(i, 2) == "*/") { +				if (in_comment && line.compare(i, 2, "*/") == 0) {  					line[i] = ' ';  					line[i+1] = ' ';  					in_comment = false;  					continue;  				} -				if (!in_comment && line.substr(i, 2) == "/*") +				if (!in_comment && line.compare(i, 2, "/*") == 0)  					in_comment = true;  				if (in_comment)  					line[i] = ' '; @@ -87,7 +87,7 @@ static void run_ice40_braminit(Module *module)  				long value;  				token = next_token(line, " \t\r\n"); -				if (token.empty() || token.substr(0, 2) == "//") +				if (token.empty() || token.compare(0, 2, "//") == 0)  					break;  				if (token[0] == '@') { diff --git a/techlibs/ice40/ice40_opt.cc b/techlibs/ice40/ice40_opt.cc index e492454fb..d5106b805 100644 --- a/techlibs/ice40/ice40_opt.cc +++ b/techlibs/ice40/ice40_opt.cc @@ -117,7 +117,7 @@ static void run_ice40_opts(Module *module)  				log("Optimized $__ICE40_FULL_ADDER cell back to logic (without SB_CARRY) %s.%s: CO=%s\n",  						log_id(module), log_id(cell), log_signal(replacement_output));  				cell->type = "$lut"; -				cell->setPort("\\A", { RTLIL::S0, inbit[0], inbit[1], inbit[2] }); +				cell->setPort("\\A", { State::S0, inbit[0], inbit[1], inbit[2] });  				cell->setPort("\\Y", cell->getPort("\\O"));  				cell->unsetPort("\\B");  				cell->unsetPort("\\CI"); diff --git a/techlibs/ice40/ice40_unlut.cc b/techlibs/ice40/ice40_unlut.cc deleted file mode 100644 index f3f70ac1f..000000000 --- a/techlibs/ice40/ice40_unlut.cc +++ /dev/null @@ -1,106 +0,0 @@ -/* - *  yosys -- Yosys Open SYnthesis Suite - * - *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at> - * - *  Permission to use, copy, modify, and/or distribute this software for any - *  purpose with or without fee is hereby granted, provided that the above - *  copyright notice and this permission notice appear in all copies. - * - *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ - -#include "kernel/yosys.h" -#include "kernel/sigtools.h" -#include <stdlib.h> -#include <stdio.h> - -USING_YOSYS_NAMESPACE -PRIVATE_NAMESPACE_BEGIN - -static SigBit get_bit_or_zero(const SigSpec &sig) -{ -	if (GetSize(sig) == 0) -		return State::S0; -	return sig[0]; -} - -static void run_ice40_unlut(Module *module) -{ -	SigMap sigmap(module); - -	for (auto cell : module->selected_cells()) -	{ -		if (cell->type == "\\SB_LUT4") -		{ -			SigSpec inbits; - -			inbits.append(get_bit_or_zero(cell->getPort("\\I0"))); -			inbits.append(get_bit_or_zero(cell->getPort("\\I1"))); -			inbits.append(get_bit_or_zero(cell->getPort("\\I2"))); -			inbits.append(get_bit_or_zero(cell->getPort("\\I3"))); -			sigmap.apply(inbits); - -			log("Mapping SB_LUT4 cell %s.%s to $lut.\n", log_id(module), log_id(cell)); - -			cell->type ="$lut"; -			cell->setParam("\\WIDTH", 4); -			cell->setParam("\\LUT", cell->getParam("\\LUT_INIT")); -			cell->unsetParam("\\LUT_INIT"); - -			cell->setPort("\\A", SigSpec({ -				get_bit_or_zero(cell->getPort("\\I0")), -				get_bit_or_zero(cell->getPort("\\I1")), -				get_bit_or_zero(cell->getPort("\\I2")), -				get_bit_or_zero(cell->getPort("\\I3")) -			})); -			cell->setPort("\\Y", cell->getPort("\\O")[0]); -			cell->unsetPort("\\I0"); -			cell->unsetPort("\\I1"); -			cell->unsetPort("\\I2"); -			cell->unsetPort("\\I3"); -			cell->unsetPort("\\O"); - -			cell->check(); -		} -	} -} - -struct Ice40UnlutPass : public Pass { -	Ice40UnlutPass() : Pass("ice40_unlut", "iCE40: transform SB_LUT4 cells to $lut cells") { } -	void help() YS_OVERRIDE -	{ -		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| -		log("\n"); -		log("    ice40_unlut [options] [selection]\n"); -		log("\n"); -		log("This command transforms all SB_LUT4 cells to generic $lut cells.\n"); -		log("\n"); -	} -	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE -	{ -		log_header(design, "Executing ICE40_UNLUT pass (convert SB_LUT4 to $lut).\n"); -		log_push(); - -		size_t argidx; -		for (argidx = 1; argidx < args.size(); argidx++) { -			// if (args[argidx] == "-???") { -			//  continue; -			// } -			break; -		} -		extra_args(args, argidx, design); - -		for (auto module : design->selected_modules()) -			run_ice40_unlut(module); -	} -} Ice40UnlutPass; - -PRIVATE_NAMESPACE_END diff --git a/techlibs/ice40/synth_ice40.cc b/techlibs/ice40/synth_ice40.cc index be60a0071..c6de81bd9 100644 --- a/techlibs/ice40/synth_ice40.cc +++ b/techlibs/ice40/synth_ice40.cc @@ -183,7 +183,7 @@ struct SynthIce40Pass : public ScriptPass  				continue;  			}  			if (args[argidx] == "-dffe_min_ce_use" && argidx+1 < args.size()) { -				min_ce_use = std::stoi(args[++argidx]); +				min_ce_use = atoi(args[++argidx].c_str());  				continue;  			}  			if (args[argidx] == "-nobram") { @@ -238,7 +238,7 @@ struct SynthIce40Pass : public ScriptPass  	{  		if (check_label("begin"))  		{ -			run("read_verilog -icells -lib -D_ABC +/ice40/cells_sim.v"); +			run("read_verilog -icells -lib +/ice40/cells_sim.v");  			run(stringf("hierarchy -check %s", help_mode ? "-top <top>" : top_opt.c_str()));  			run("proc");  		} @@ -293,8 +293,10 @@ struct SynthIce40Pass : public ScriptPass  		{  			if (nocarry)  				run("techmap"); -			else -				run("techmap -map +/techmap.v -map +/ice40/arith_map.v" + std::string(abc == "abc9" ? " -D _ABC" : "")); +			else { +				run("ice40_wrapcarry"); +				run("techmap -map +/techmap.v -map +/ice40/arith_map.v"); +			}  			if (retime || help_mode)  				run(abc + " -dff", "(only if -retime)");  			run("ice40_opt"); @@ -309,7 +311,7 @@ struct SynthIce40Pass : public ScriptPass  				run("opt_merge");  				run(stringf("dff2dffe -unmap-mince %d", min_ce_use));  			} -			run("techmap -D NO_LUT -map +/ice40/cells_map.v"); +			run("techmap -D NO_LUT -D NO_ADDER -map +/ice40/cells_map.v");  			run("opt_expr -mux_undef");  			run("simplemap");  			run("ice40_ffinit"); @@ -338,13 +340,12 @@ struct SynthIce40Pass : public ScriptPass  					else  						wire_delay = 250;  					run(abc + stringf(" -W %d -lut +/ice40/abc_%s.lut -box +/ice40/abc_%s.box", wire_delay, device_opt.c_str(), device_opt.c_str()), "(skip if -noabc)"); -					run("techmap -D NO_LUT -D _ABC -map +/ice40/cells_map.v");  				}  				else  					run(abc + " -dress -lut 4", "(skip if -noabc)");  			} +			run("techmap -D NO_LUT -map +/ice40/cells_map.v");  			run("clean"); -			run("ice40_unlut");  			run("opt_lut -dlogic SB_CARRY:I0=2:I1=1:CI=0");  		} diff --git a/techlibs/ice40/tests/test_arith.ys b/techlibs/ice40/tests/test_arith.ys index 160c767fb..ddb80b700 100644 --- a/techlibs/ice40/tests/test_arith.ys +++ b/techlibs/ice40/tests/test_arith.ys @@ -1,6 +1,5 @@  read_verilog test_arith.v  synth_ice40 -techmap -map ../cells_sim.v  rename test gate  read_verilog test_arith.v @@ -8,3 +7,11 @@ rename test gold  miter -equiv -flatten -make_outputs gold gate miter  sat -verify -prove trigger 0 -show-ports miter + +synth_ice40 -top gate + +read_verilog test_arith.v +rename test gold + +miter -equiv -flatten -make_outputs gold gate miter +sat -verify -prove trigger 0 -show-ports miter diff --git a/techlibs/ice40/tests/test_dsp_model.sh b/techlibs/ice40/tests/test_dsp_model.sh index 1bc0cc688..1e564d1b2 100644 --- a/techlibs/ice40/tests/test_dsp_model.sh +++ b/techlibs/ice40/tests/test_dsp_model.sh @@ -1,10 +1,15 @@  #!/bin/bash  set -ex  sed 's/SB_MAC16/SB_MAC16_UUT/; /SB_MAC16_UUT/,/endmodule/ p; d;' < ../cells_sim.v > test_dsp_model_uut.v -cat /opt/lscc/iCEcube2.2017.01/verilog/sb_ice_syn.v > test_dsp_model_ref.v +if [ ! -f "test_dsp_model_ref.v" ]; then +	cat /opt/lscc/iCEcube2.2017.01/verilog/sb_ice_syn.v > test_dsp_model_ref.v +fi  for tb in testbench \  		testbench_comb_8x8_A testbench_comb_8x8_B testbench_comb_16x16 \ -		testbench_seq_16x16_A testbench_seq_16x16_B +		testbench_seq_16x16_A testbench_seq_16x16_B \ +		testbench_comb_8x8_A_signedA testbench_comb_8x8_A_signedB testbench_comb_8x8_A_signedAB \ +		testbench_comb_8x8_B_signedA testbench_comb_8x8_B_signedB testbench_comb_8x8_B_signedAB \ +		testbench_comb_16x16_signedA testbench_comb_16x16_signedB testbench_comb_16x16_signedAB  do  	iverilog -s $tb -o test_dsp_model test_dsp_model.v test_dsp_model_uut.v test_dsp_model_ref.v  	vvp -N ./test_dsp_model diff --git a/techlibs/ice40/tests/test_dsp_model.v b/techlibs/ice40/tests/test_dsp_model.v index 594bd4ad3..f4f6858f0 100644 --- a/techlibs/ice40/tests/test_dsp_model.v +++ b/techlibs/ice40/tests/test_dsp_model.v @@ -241,6 +241,81 @@ module testbench_comb_8x8_A;  	) testbench ();  endmodule +module testbench_comb_8x8_A_signedA; +	testbench #( +		.NEG_TRIGGER               (0), +		.C_REG                     (0), +		.A_REG                     (0), +		.B_REG                     (0), +		.D_REG                     (0), +		.TOP_8x8_MULT_REG          (0), +		.BOT_8x8_MULT_REG          (0), +		.PIPELINE_16x16_MULT_REG1  (0), +		.PIPELINE_16x16_MULT_REG2  (0), +		.TOPOUTPUT_SELECT          (2),   // 0=P, 1=Q, 2=8x8, 3=16x16 +		.TOPADDSUB_LOWERINPUT      (0),   // 0=A, 1=8x8, 2=16x16, 3=S-EXT +		.TOPADDSUB_UPPERINPUT      (0),   // 0=Q, 1=C +		.TOPADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.BOTOUTPUT_SELECT          (2),   // 0=R, 1=S, 2=8x8, 3=16x16 +		.BOTADDSUB_LOWERINPUT      (0),   // 0=B, 1=8x8, 2=16x16, 3=S-EXT +		.BOTADDSUB_UPPERINPUT      (0),   // 0=S, 1=D +		.BOTADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.MODE_8x8                  (0), +		.A_SIGNED                  (1), +		.B_SIGNED                  (0) +	) testbench (); +endmodule + +module testbench_comb_8x8_A_signedB; +	testbench #( +		.NEG_TRIGGER               (0), +		.C_REG                     (0), +		.A_REG                     (0), +		.B_REG                     (0), +		.D_REG                     (0), +		.TOP_8x8_MULT_REG          (0), +		.BOT_8x8_MULT_REG          (0), +		.PIPELINE_16x16_MULT_REG1  (0), +		.PIPELINE_16x16_MULT_REG2  (0), +		.TOPOUTPUT_SELECT          (2),   // 0=P, 1=Q, 2=8x8, 3=16x16 +		.TOPADDSUB_LOWERINPUT      (0),   // 0=A, 1=8x8, 2=16x16, 3=S-EXT +		.TOPADDSUB_UPPERINPUT      (0),   // 0=Q, 1=C +		.TOPADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.BOTOUTPUT_SELECT          (2),   // 0=R, 1=S, 2=8x8, 3=16x16 +		.BOTADDSUB_LOWERINPUT      (0),   // 0=B, 1=8x8, 2=16x16, 3=S-EXT +		.BOTADDSUB_UPPERINPUT      (0),   // 0=S, 1=D +		.BOTADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.MODE_8x8                  (0), +		.A_SIGNED                  (0), +		.B_SIGNED                  (1) +	) testbench (); +endmodule + +module testbench_comb_8x8_A_signedAB; +	testbench #( +		.NEG_TRIGGER               (0), +		.C_REG                     (0), +		.A_REG                     (0), +		.B_REG                     (0), +		.D_REG                     (0), +		.TOP_8x8_MULT_REG          (0), +		.BOT_8x8_MULT_REG          (0), +		.PIPELINE_16x16_MULT_REG1  (0), +		.PIPELINE_16x16_MULT_REG2  (0), +		.TOPOUTPUT_SELECT          (2),   // 0=P, 1=Q, 2=8x8, 3=16x16 +		.TOPADDSUB_LOWERINPUT      (0),   // 0=A, 1=8x8, 2=16x16, 3=S-EXT +		.TOPADDSUB_UPPERINPUT      (0),   // 0=Q, 1=C +		.TOPADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.BOTOUTPUT_SELECT          (2),   // 0=R, 1=S, 2=8x8, 3=16x16 +		.BOTADDSUB_LOWERINPUT      (0),   // 0=B, 1=8x8, 2=16x16, 3=S-EXT +		.BOTADDSUB_UPPERINPUT      (0),   // 0=S, 1=D +		.BOTADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.MODE_8x8                  (0), +		.A_SIGNED                  (1), +		.B_SIGNED                  (1) +	) testbench (); +endmodule +  module testbench_comb_8x8_B;  	testbench #(  		.NEG_TRIGGER               (0), @@ -266,6 +341,81 @@ module testbench_comb_8x8_B;  	) testbench ();  endmodule +module testbench_comb_8x8_B_signedA; +	testbench #( +		.NEG_TRIGGER               (0), +		.C_REG                     (0), +		.A_REG                     (0), +		.B_REG                     (0), +		.D_REG                     (0), +		.TOP_8x8_MULT_REG          (0), +		.BOT_8x8_MULT_REG          (0), +		.PIPELINE_16x16_MULT_REG1  (0), +		.PIPELINE_16x16_MULT_REG2  (0), +		.TOPOUTPUT_SELECT          (0),   // 0=P, 1=Q, 2=8x8, 3=16x16 +		.TOPADDSUB_LOWERINPUT      (1),   // 0=A, 1=8x8, 2=16x16, 3=S-EXT +		.TOPADDSUB_UPPERINPUT      (1),   // 0=Q, 1=C +		.TOPADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.BOTOUTPUT_SELECT          (0),   // 0=R, 1=S, 2=8x8, 3=16x16 +		.BOTADDSUB_LOWERINPUT      (1),   // 0=B, 1=8x8, 2=16x16, 3=S-EXT +		.BOTADDSUB_UPPERINPUT      (1),   // 0=S, 1=D +		.BOTADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.MODE_8x8                  (0), +		.A_SIGNED                  (1), +		.B_SIGNED                  (0) +	) testbench (); +endmodule + +module testbench_comb_8x8_B_signedB; +	testbench #( +		.NEG_TRIGGER               (0), +		.C_REG                     (0), +		.A_REG                     (0), +		.B_REG                     (0), +		.D_REG                     (0), +		.TOP_8x8_MULT_REG          (0), +		.BOT_8x8_MULT_REG          (0), +		.PIPELINE_16x16_MULT_REG1  (0), +		.PIPELINE_16x16_MULT_REG2  (0), +		.TOPOUTPUT_SELECT          (0),   // 0=P, 1=Q, 2=8x8, 3=16x16 +		.TOPADDSUB_LOWERINPUT      (1),   // 0=A, 1=8x8, 2=16x16, 3=S-EXT +		.TOPADDSUB_UPPERINPUT      (1),   // 0=Q, 1=C +		.TOPADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.BOTOUTPUT_SELECT          (0),   // 0=R, 1=S, 2=8x8, 3=16x16 +		.BOTADDSUB_LOWERINPUT      (1),   // 0=B, 1=8x8, 2=16x16, 3=S-EXT +		.BOTADDSUB_UPPERINPUT      (1),   // 0=S, 1=D +		.BOTADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.MODE_8x8                  (0), +		.A_SIGNED                  (0), +		.B_SIGNED                  (1) +	) testbench (); +endmodule + +module testbench_comb_8x8_B_signedAB; +	testbench #( +		.NEG_TRIGGER               (0), +		.C_REG                     (0), +		.A_REG                     (0), +		.B_REG                     (0), +		.D_REG                     (0), +		.TOP_8x8_MULT_REG          (0), +		.BOT_8x8_MULT_REG          (0), +		.PIPELINE_16x16_MULT_REG1  (0), +		.PIPELINE_16x16_MULT_REG2  (0), +		.TOPOUTPUT_SELECT          (0),   // 0=P, 1=Q, 2=8x8, 3=16x16 +		.TOPADDSUB_LOWERINPUT      (1),   // 0=A, 1=8x8, 2=16x16, 3=S-EXT +		.TOPADDSUB_UPPERINPUT      (1),   // 0=Q, 1=C +		.TOPADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.BOTOUTPUT_SELECT          (0),   // 0=R, 1=S, 2=8x8, 3=16x16 +		.BOTADDSUB_LOWERINPUT      (1),   // 0=B, 1=8x8, 2=16x16, 3=S-EXT +		.BOTADDSUB_UPPERINPUT      (1),   // 0=S, 1=D +		.BOTADDSUB_CARRYSELECT     (0),   // 0=0, 1=1, 2=ACI, 3=CI +		.MODE_8x8                  (0), +		.A_SIGNED                  (1), +		.B_SIGNED                  (1) +	) testbench (); +endmodule +  module testbench_comb_16x16;  	testbench #(  		.NEG_TRIGGER               (0), @@ -291,6 +441,81 @@ module testbench_comb_16x16;  	) testbench ();  endmodule +module testbench_comb_16x16_signedA; +	testbench #( +		.NEG_TRIGGER               (0), +		.C_REG                     (0), +		.A_REG                     (0), +		.B_REG                     (0), +		.D_REG                     (0), +		.TOP_8x8_MULT_REG          (0), +		.BOT_8x8_MULT_REG          (0), +		.PIPELINE_16x16_MULT_REG1  (0), +		.PIPELINE_16x16_MULT_REG2  (0), +		.TOPOUTPUT_SELECT          (0),   // 0=P, 1=Q, 2=8x8, 3=16x16 +		.TOPADDSUB_LOWERINPUT      (2),   // 0=A, 1=8x8, 2=16x16, 3=S-EXT +		.TOPADDSUB_UPPERINPUT      (1),   // 0=Q, 1=C +		.TOPADDSUB_CARRYSELECT     (2),   // 0=0, 1=1, 2=ACI, 3=CI +		.BOTOUTPUT_SELECT          (0),   // 0=R, 1=S, 2=8x8, 3=16x16 +		.BOTADDSUB_LOWERINPUT      (2),   // 0=B, 1=8x8, 2=16x16, 3=S-EXT +		.BOTADDSUB_UPPERINPUT      (1),   // 0=S, 1=D +		.BOTADDSUB_CARRYSELECT     (2),   // 0=0, 1=1, 2=ACI, 3=CI +		.MODE_8x8                  (0), +		.A_SIGNED                  (1), +		.B_SIGNED                  (0) +	) testbench (); +endmodule + +module testbench_comb_16x16_signedB; +	testbench #( +		.NEG_TRIGGER               (0), +		.C_REG                     (0), +		.A_REG                     (0), +		.B_REG                     (0), +		.D_REG                     (0), +		.TOP_8x8_MULT_REG          (0), +		.BOT_8x8_MULT_REG          (0), +		.PIPELINE_16x16_MULT_REG1  (0), +		.PIPELINE_16x16_MULT_REG2  (0), +		.TOPOUTPUT_SELECT          (0),   // 0=P, 1=Q, 2=8x8, 3=16x16 +		.TOPADDSUB_LOWERINPUT      (2),   // 0=A, 1=8x8, 2=16x16, 3=S-EXT +		.TOPADDSUB_UPPERINPUT      (1),   // 0=Q, 1=C +		.TOPADDSUB_CARRYSELECT     (2),   // 0=0, 1=1, 2=ACI, 3=CI +		.BOTOUTPUT_SELECT          (0),   // 0=R, 1=S, 2=8x8, 3=16x16 +		.BOTADDSUB_LOWERINPUT      (2),   // 0=B, 1=8x8, 2=16x16, 3=S-EXT +		.BOTADDSUB_UPPERINPUT      (1),   // 0=S, 1=D +		.BOTADDSUB_CARRYSELECT     (2),   // 0=0, 1=1, 2=ACI, 3=CI +		.MODE_8x8                  (0), +		.A_SIGNED                  (0), +		.B_SIGNED                  (1) +	) testbench (); +endmodule + +module testbench_comb_16x16_signedAB; +	testbench #( +		.NEG_TRIGGER               (0), +		.C_REG                     (0), +		.A_REG                     (0), +		.B_REG                     (0), +		.D_REG                     (0), +		.TOP_8x8_MULT_REG          (0), +		.BOT_8x8_MULT_REG          (0), +		.PIPELINE_16x16_MULT_REG1  (0), +		.PIPELINE_16x16_MULT_REG2  (0), +		.TOPOUTPUT_SELECT          (0),   // 0=P, 1=Q, 2=8x8, 3=16x16 +		.TOPADDSUB_LOWERINPUT      (2),   // 0=A, 1=8x8, 2=16x16, 3=S-EXT +		.TOPADDSUB_UPPERINPUT      (1),   // 0=Q, 1=C +		.TOPADDSUB_CARRYSELECT     (2),   // 0=0, 1=1, 2=ACI, 3=CI +		.BOTOUTPUT_SELECT          (0),   // 0=R, 1=S, 2=8x8, 3=16x16 +		.BOTADDSUB_LOWERINPUT      (2),   // 0=B, 1=8x8, 2=16x16, 3=S-EXT +		.BOTADDSUB_UPPERINPUT      (1),   // 0=S, 1=D +		.BOTADDSUB_CARRYSELECT     (2),   // 0=0, 1=1, 2=ACI, 3=CI +		.MODE_8x8                  (0), +		.A_SIGNED                  (1), +		.B_SIGNED                  (1) +	) testbench (); +endmodule +  module testbench_seq_16x16_A;  	testbench #(  		.NEG_TRIGGER               (0),  | 
