mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-03 04:41:22 +00:00
[wip] sim model testing
Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
parent
ccfb4ff2a9
commit
f0f352e971
4 changed files with 77 additions and 15 deletions
|
@ -728,7 +728,7 @@ module DSP48E1 (
|
||||||
maj_xyz_gated[23] ^ int_carry_out[1],
|
maj_xyz_gated[23] ^ int_carry_out[1],
|
||||||
1'bx
|
1'bx
|
||||||
};
|
};
|
||||||
end else if (USE_SIMD == "FOUR48") begin
|
end else begin
|
||||||
assign maj_xyz_simd_gated = {maj_xyz_gated, alu_cin};
|
assign maj_xyz_simd_gated = {maj_xyz_gated, alu_cin};
|
||||||
assign int_carry_in[3:1] = int_carry_out[2:0];
|
assign int_carry_in[3:1] = int_carry_out[2:0];
|
||||||
assign ext_carry_out = {
|
assign ext_carry_out = {
|
||||||
|
@ -738,7 +738,7 @@ module DSP48E1 (
|
||||||
end
|
end
|
||||||
|
|
||||||
genvar i;
|
genvar i;
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i = i + 1)
|
||||||
assign {int_carry_out[i], alu_sum[i*12 +: 12]} = {1'b0, maj_xyz_simd_gated[i*12 +: ((i == 3) ? 13 : 12)]}
|
assign {int_carry_out[i], alu_sum[i*12 +: 12]} = {1'b0, maj_xyz_simd_gated[i*12 +: ((i == 3) ? 13 : 12)]}
|
||||||
+ xor_xyz_muxed[i*12 +: 12] + int_carry_in[i];
|
+ xor_xyz_muxed[i*12 +: 12] + int_carry_in[i];
|
||||||
endgenerate
|
endgenerate
|
||||||
|
|
6
techlibs/xilinx/tests/.gitignore
vendored
6
techlibs/xilinx/tests/.gitignore
vendored
|
@ -4,4 +4,8 @@ bram1_[0-9]*/
|
||||||
bram2.log
|
bram2.log
|
||||||
bram2_syn.v
|
bram2_syn.v
|
||||||
bram2_tb
|
bram2_tb
|
||||||
dsp_work*/
|
dsp_work*/
|
||||||
|
test_dsp_model_ref.v
|
||||||
|
test_dsp_model_uut.v
|
||||||
|
test_dsp_model
|
||||||
|
*.vcd
|
||||||
|
|
11
techlibs/xilinx/tests/test_dsp_model.sh
Normal file
11
techlibs/xilinx/tests/test_dsp_model.sh
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -ex
|
||||||
|
sed 's/DSP48E1/DSP48E1_UUT/; /DSP48E1_UUT/,/endmodule/ p; d;' < ../cells_sim.v > test_dsp_model_uut.v
|
||||||
|
if [ ! -f "test_dsp_model_ref.v" ]; then
|
||||||
|
cat /opt/Xilinx/Vivado/2019.1/data/verilog/src/unisims/DSP48E1.v > test_dsp_model_ref.v
|
||||||
|
fi
|
||||||
|
for tb in mult_noreg_nopreadd_nocasc
|
||||||
|
do
|
||||||
|
iverilog -s $tb -s glbl -o test_dsp_model test_dsp_model.v test_dsp_model_uut.v test_dsp_model_ref.v /opt/Xilinx/Vivado/2019.1/data/verilog/src/glbl.v
|
||||||
|
vvp -N ./test_dsp_model
|
||||||
|
done
|
|
@ -83,12 +83,21 @@ module testbench;
|
||||||
|
|
||||||
reg config_valid = 0;
|
reg config_valid = 0;
|
||||||
task drc;
|
task drc;
|
||||||
config_valid = 1;
|
begin
|
||||||
if (AREG != 2 && INMODE[0]) config_valid = 0;
|
config_valid = 1;
|
||||||
if (BREG != 2 && INMODE[4]) config_valid = 0;
|
if (AREG != 2 && INMODE[0]) config_valid = 0;
|
||||||
if ((OPMODE[3:2] == 2'b01) ^ (OPMODE[1:0] == 2'b01) == 1'b1) config_valid = 0;
|
if (BREG != 2 && INMODE[4]) config_valid = 0;
|
||||||
if ((OPMODE[6:4] == 3'b010) && PREG != 1) config_valid = 0;
|
if (OPMODE[1:0] == 2'b10 && PREG != 1) config_valid = 0;
|
||||||
if ((OPMODE[6:4] == 3'b010) && (PREG != 1 || OPMODE[3:0] != 4'b1000)) config_valid = 0;
|
if ((OPMODE[3:2] == 2'b01) ^ (OPMODE[1:0] == 2'b01) == 1'b1) config_valid = 0;
|
||||||
|
if ((OPMODE[6:4] == 3'b010 || OPMODE[6:4] == 3'b110) && PREG != 1) config_valid = 0;
|
||||||
|
if ((OPMODE[6:4] == 3'b100) && (PREG != 1 || OPMODE[3:0] != 4'b1000)) config_valid = 0;
|
||||||
|
if ((CARRYINSEL == 3'b100 || CARRYINSEL == 3'b101 || CARRYINSEL == 3'b111) && (PREG != 1)) config_valid = 0;
|
||||||
|
if (OPMODE[6:4] == 3'b111) config_valid = 0;
|
||||||
|
if ((ALUMODE[3:2] == 2'b01 || ALUMODE[3:2] == 2'b11) && OPMODE[3:2] != 2'b00 && OPMODE[3:2] != 2'b10) config_valid = 0;
|
||||||
|
if ((OPMODE[3:0] == 4'b0101) && CARRYINSEL == 3'b010) config_valid = 0;
|
||||||
|
if (CARRYINSEL == 3'b010 && OPMODE != 7'b0001010) config_valid = 0;
|
||||||
|
if (CARRYINSEL == 3'b001 && OPMODE != 7'b1010101) config_valid = 0;
|
||||||
|
end
|
||||||
endtask
|
endtask
|
||||||
|
|
||||||
initial begin
|
initial begin
|
||||||
|
@ -109,7 +118,7 @@ module testbench;
|
||||||
#5;
|
#5;
|
||||||
CLK = 1'b1;
|
CLK = 1'b1;
|
||||||
#10;
|
#10;
|
||||||
CLK = 1'b0
|
CLK = 1'b0;
|
||||||
#5;
|
#5;
|
||||||
CLK = 1'b1;
|
CLK = 1'b1;
|
||||||
#10;
|
#10;
|
||||||
|
@ -118,7 +127,8 @@ module testbench;
|
||||||
|
|
||||||
repeat (300) begin
|
repeat (300) begin
|
||||||
clkcycle;
|
clkcycle;
|
||||||
do begin
|
config_valid = 0;
|
||||||
|
while (!config_valid) begin
|
||||||
A = $urandom;
|
A = $urandom;
|
||||||
ACIN = $urandom;
|
ACIN = $urandom;
|
||||||
B = $urandom;
|
B = $urandom;
|
||||||
|
@ -129,10 +139,12 @@ module testbench;
|
||||||
|
|
||||||
{RSTA, RSTALLCARRYIN, RSTALUMODE, RSTB, RSTC, RSTD, RSTINMODE, RSTM, RSTP} = $urandom & $urandom & $urandom;
|
{RSTA, RSTALLCARRYIN, RSTALUMODE, RSTB, RSTC, RSTD, RSTINMODE, RSTM, RSTP} = $urandom & $urandom & $urandom;
|
||||||
{ALUMODE, CARRYINSEL, INMODE} = $urandom & $urandom & $urandom;
|
{ALUMODE, CARRYINSEL, INMODE} = $urandom & $urandom & $urandom;
|
||||||
OPMODE = $urandom;
|
OPMODE = $urandom;
|
||||||
|
if ($urandom & 1'b1)
|
||||||
|
OPMODE[3:0] = 4'b0101; // test multiply more than other modes
|
||||||
{CARRYCASCIN, CARRYIN, MULTSIGNIN} = $urandom;
|
{CARRYCASCIN, CARRYIN, MULTSIGNIN} = $urandom;
|
||||||
drc;
|
drc;
|
||||||
end while (!config_valid);
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if (errcount == 0) begin
|
if (errcount == 0) begin
|
||||||
|
@ -194,6 +206,7 @@ module testbench;
|
||||||
.BCIN (BCIN),
|
.BCIN (BCIN),
|
||||||
.C (C),
|
.C (C),
|
||||||
.CARRYCASCIN (CARRYCASCIN),
|
.CARRYCASCIN (CARRYCASCIN),
|
||||||
|
.CARRYINSEL (CARRYINSEL),
|
||||||
.CEA1 (CEA1),
|
.CEA1 (CEA1),
|
||||||
.CEA2 (CEA2),
|
.CEA2 (CEA2),
|
||||||
.CEAD (CEAD),
|
.CEAD (CEAD),
|
||||||
|
@ -275,6 +288,7 @@ module testbench;
|
||||||
.BCIN (BCIN),
|
.BCIN (BCIN),
|
||||||
.C (C),
|
.C (C),
|
||||||
.CARRYCASCIN (CARRYCASCIN),
|
.CARRYCASCIN (CARRYCASCIN),
|
||||||
|
.CARRYINSEL (CARRYINSEL),
|
||||||
.CEA1 (CEA1),
|
.CEA1 (CEA1),
|
||||||
.CEA2 (CEA2),
|
.CEA2 (CEA2),
|
||||||
.CEAD (CEAD),
|
.CEAD (CEAD),
|
||||||
|
@ -305,6 +319,39 @@ module testbench;
|
||||||
.RSTM (RSTM),
|
.RSTM (RSTM),
|
||||||
.RSTP (RSTP)
|
.RSTP (RSTP)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
module mult_noreg_nopreadd_nocasc;
|
||||||
|
testbench #(
|
||||||
|
.ACASCREG (0),
|
||||||
|
.ADREG (0),
|
||||||
|
.ALUMODEREG (0),
|
||||||
|
.AREG (0),
|
||||||
|
.AUTORESET_PATDET ("NO_RESET"),
|
||||||
|
.A_INPUT ("DIRECT"),
|
||||||
|
.BCASCREG (0),
|
||||||
|
.BREG (0),
|
||||||
|
.B_INPUT ("DIRECT"),
|
||||||
|
.CARRYINREG (0),
|
||||||
|
.CARRYINSELREG (0),
|
||||||
|
.CREG (0),
|
||||||
|
.DREG (0),
|
||||||
|
.INMODEREG (0),
|
||||||
|
.MREG (0),
|
||||||
|
.OPMODEREG (0),
|
||||||
|
.PREG (0),
|
||||||
|
.SEL_MASK ("MASK"),
|
||||||
|
.SEL_PATTERN ("PATTERN"),
|
||||||
|
.USE_DPORT ("FALSE"),
|
||||||
|
.USE_MULT ("DYNAMIC"),
|
||||||
|
.USE_PATTERN_DETECT ("NO_PATDET"),
|
||||||
|
.USE_SIMD ("ONE48"),
|
||||||
|
.MASK (48'h3FFFFFFFFFFF),
|
||||||
|
.PATTERN (48'h000000000000),
|
||||||
|
.IS_ALUMODE_INVERTED(4'b0),
|
||||||
|
.IS_CARRYIN_INVERTED(1'b0),
|
||||||
|
.IS_CLK_INVERTED (1'b0),
|
||||||
|
.IS_INMODE_INVERTED (5'b0),
|
||||||
|
.IS_OPMODE_INVERTED (7'b0)
|
||||||
|
) testbench ();
|
||||||
|
endmodule
|
Loading…
Add table
Add a link
Reference in a new issue