mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Merge remote-tracking branch 'origin/eddie/signed_ice40_dsp' into ice40dsp
This commit is contained in:
		
						commit
						d439a830c6
					
				
					 3 changed files with 239 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -1366,10 +1366,10 @@ module SB_MAC16 (
 | 
			
		|||
	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 && MODE_8x8 ? {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 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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue