diff options
| author | Miodrag Milanovic <mmicko@gmail.com> | 2019-10-18 11:06:12 +0200 | 
|---|---|---|
| committer | Miodrag Milanovic <mmicko@gmail.com> | 2019-10-18 11:06:12 +0200 | 
| commit | c2ec7ca7031e2e9c655723fcdb3ce3cb83cc74b1 (patch) | |
| tree | 79cce7951390a0068beeab26be5d310222059c51 /tests/arch/ice40 | |
| parent | 3c41599ee1f62e4d77ba630fa1a245ef3fe236fa (diff) | |
| download | yosys-c2ec7ca7031e2e9c655723fcdb3ce3cb83cc74b1.tar.gz yosys-c2ec7ca7031e2e9c655723fcdb3ce3cb83cc74b1.tar.bz2 yosys-c2ec7ca7031e2e9c655723fcdb3ce3cb83cc74b1.zip | |
Moved all tests in arch sub directory
Diffstat (limited to 'tests/arch/ice40')
38 files changed, 861 insertions, 0 deletions
| diff --git a/tests/arch/ice40/.gitignore b/tests/arch/ice40/.gitignore new file mode 100644 index 000000000..9a71dca69 --- /dev/null +++ b/tests/arch/ice40/.gitignore @@ -0,0 +1,4 @@ +*.log +/run-test.mk ++*_synth.v ++*_testbench diff --git a/tests/arch/ice40/add_sub.v b/tests/arch/ice40/add_sub.v new file mode 100644 index 000000000..177c32e30 --- /dev/null +++ b/tests/arch/ice40/add_sub.v @@ -0,0 +1,13 @@ +module top +( + input [3:0] x, + input [3:0] y, + + output [3:0] A, + output [3:0] B + ); + +assign A =  x + y; +assign B =  x - y; + +endmodule diff --git a/tests/arch/ice40/add_sub.ys b/tests/arch/ice40/add_sub.ys new file mode 100644 index 000000000..4a998d98d --- /dev/null +++ b/tests/arch/ice40/add_sub.ys @@ -0,0 +1,9 @@ +read_verilog add_sub.v +hierarchy -top top +equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 11 t:SB_LUT4 +select -assert-count 6 t:SB_CARRY +select -assert-none t:SB_LUT4 t:SB_CARRY %% t:* %D + diff --git a/tests/arch/ice40/adffs.v b/tests/arch/ice40/adffs.v new file mode 100644 index 000000000..09dc36001 --- /dev/null +++ b/tests/arch/ice40/adffs.v @@ -0,0 +1,87 @@ +module adff +    ( input d, clk, clr, output reg q ); +    initial begin +      q = 0; +    end +	always @( posedge clk, posedge clr ) +		if ( clr ) +			q <= 1'b0; +		else +            q <= d; +endmodule + +module adffn +    ( input d, clk, clr, output reg q ); +    initial begin +      q = 0; +    end +	always @( posedge clk, negedge clr ) +		if ( !clr ) +			q <= 1'b0; +		else +            q <= d; +endmodule + +module dffs +    ( input d, clk, pre, clr, output reg q ); +    initial begin +      q = 0; +    end +	always @( posedge clk, posedge pre ) +		if ( pre ) +			q <= 1'b1; +		else +            q <= d; +endmodule + +module ndffnr +    ( input d, clk, pre, clr, output reg q ); +    initial begin +      q = 0; +    end +	always @( negedge clk, negedge pre ) +		if ( !pre ) +			q <= 1'b1; +		else +            q <= d; +endmodule + +module top ( +input clk, +input clr, +input pre, +input a, +output b,b1,b2,b3 +); + +dffs u_dffs ( +        .clk (clk ), +        .clr (clr), +        .pre (pre), +        .d (a ), +        .q (b ) +    ); + +ndffnr u_ndffnr ( +        .clk (clk ), +        .clr (clr), +        .pre (pre), +        .d (a ), +        .q (b1 ) +    ); + +adff u_adff ( +        .clk (clk ), +        .clr (clr), +        .d (a ), +        .q (b2 ) +    ); + +adffn u_adffn ( +        .clk (clk ), +        .clr (clr), +        .d (a ), +        .q (b3 ) +    ); + +endmodule diff --git a/tests/arch/ice40/adffs.ys b/tests/arch/ice40/adffs.ys new file mode 100644 index 000000000..548060b66 --- /dev/null +++ b/tests/arch/ice40/adffs.ys @@ -0,0 +1,11 @@ +read_verilog adffs.v +proc +flatten +equiv_opt -multiclock -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 1 t:SB_DFFNS +select -assert-count 2 t:SB_DFFR +select -assert-count 1 t:SB_DFFS +select -assert-count 2 t:SB_LUT4 +select -assert-none t:SB_DFFNS t:SB_DFFR t:SB_DFFS t:SB_LUT4 %% t:* %D diff --git a/tests/arch/ice40/alu.v b/tests/arch/ice40/alu.v new file mode 100644 index 000000000..f82cc2e21 --- /dev/null +++ b/tests/arch/ice40/alu.v @@ -0,0 +1,19 @@ +module top ( +	input clock, +	input [31:0] dinA, dinB, +	input [2:0] opcode, +	output reg [31:0] dout +); +	always @(posedge clock) begin +		case (opcode) +		0: dout <= dinA + dinB; +		1: dout <= dinA - dinB; +		2: dout <= dinA >> dinB; +		3: dout <= $signed(dinA) >>> dinB; +		4: dout <= dinA << dinB; +		5: dout <= dinA & dinB; +		6: dout <= dinA | dinB; +		7: dout <= dinA ^ dinB; +		endcase +	end +endmodule diff --git a/tests/arch/ice40/alu.ys b/tests/arch/ice40/alu.ys new file mode 100644 index 000000000..bd859efc4 --- /dev/null +++ b/tests/arch/ice40/alu.ys @@ -0,0 +1,11 @@ +read_verilog alu.v +hierarchy -top top +proc +flatten +equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 62 t:SB_CARRY +select -assert-count 32 t:SB_DFF +select -assert-count 655 t:SB_LUT4 +select -assert-none t:SB_CARRY t:SB_DFF t:SB_LUT4 %% t:* %D diff --git a/tests/arch/ice40/counter.v b/tests/arch/ice40/counter.v new file mode 100644 index 000000000..52852f8ac --- /dev/null +++ b/tests/arch/ice40/counter.v @@ -0,0 +1,17 @@ +module top    (
 +out,
 +clk,
 +reset
 +);
 +    output [7:0] out;
 +    input clk, reset;
 +    reg [7:0] out;
 +
 +    always @(posedge clk, posedge reset)
 +		if (reset) begin
 +			out <= 8'b0 ;
 +		end else
 +			out <= out + 1;
 +
 +
 +endmodule
 diff --git a/tests/arch/ice40/counter.ys b/tests/arch/ice40/counter.ys new file mode 100644 index 000000000..c65c21622 --- /dev/null +++ b/tests/arch/ice40/counter.ys @@ -0,0 +1,11 @@ +read_verilog counter.v +hierarchy -top top +proc +flatten +equiv_opt -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 6 t:SB_CARRY +select -assert-count 8 t:SB_DFFR +select -assert-count 8 t:SB_LUT4 +select -assert-none t:SB_CARRY t:SB_DFFR t:SB_LUT4 %% t:* %D diff --git a/tests/arch/ice40/dffs.v b/tests/arch/ice40/dffs.v new file mode 100644 index 000000000..d97840c43 --- /dev/null +++ b/tests/arch/ice40/dffs.v @@ -0,0 +1,37 @@ +module dff +    ( input d, clk, output reg q ); +	always @( posedge clk ) +            q <= d; +endmodule + +module dffe +    ( input d, clk, en, output reg q ); +    initial begin +      q = 0; +    end +	always @( posedge clk ) +		if ( en ) +			q <= d; +endmodule + +module top ( +input clk, +input en, +input a, +output b,b1, +); + +dff u_dff ( +        .clk (clk ), +        .d (a ), +        .q (b ) +    ); + +dffe u_ndffe ( +        .clk (clk ), +        .en (en), +        .d (a ), +        .q (b1 ) +    ); + +endmodule diff --git a/tests/arch/ice40/dffs.ys b/tests/arch/ice40/dffs.ys new file mode 100644 index 000000000..ee7f884b1 --- /dev/null +++ b/tests/arch/ice40/dffs.ys @@ -0,0 +1,10 @@ +read_verilog dffs.v +hierarchy -top top +proc +flatten +equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 1 t:SB_DFF +select -assert-count 1 t:SB_DFFE +select -assert-none t:SB_DFF t:SB_DFFE %% t:* %D diff --git a/tests/arch/ice40/div_mod.v b/tests/arch/ice40/div_mod.v new file mode 100644 index 000000000..64a36707d --- /dev/null +++ b/tests/arch/ice40/div_mod.v @@ -0,0 +1,13 @@ +module top +( + input [3:0] x, + input [3:0] y, + + output [3:0] A, + output [3:0] B + ); + +assign A =  x % y; +assign B =  x / y; + +endmodule diff --git a/tests/arch/ice40/div_mod.ys b/tests/arch/ice40/div_mod.ys new file mode 100644 index 000000000..821d6c301 --- /dev/null +++ b/tests/arch/ice40/div_mod.ys @@ -0,0 +1,9 @@ +read_verilog div_mod.v +hierarchy -top top +flatten +equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 59 t:SB_LUT4 +select -assert-count 41 t:SB_CARRY +select -assert-none t:SB_LUT4 t:SB_CARRY %% t:* %D diff --git a/tests/arch/ice40/dpram.v b/tests/arch/ice40/dpram.v new file mode 100644 index 000000000..3ea4c1f27 --- /dev/null +++ b/tests/arch/ice40/dpram.v @@ -0,0 +1,23 @@ +/* +Example from: https://www.latticesemi.com/-/media/LatticeSemi/Documents/UserManuals/EI/iCEcube201701UserGuide.ashx?document_id=52071 [p. 72]. +*/ +module top (din, write_en, waddr, wclk, raddr, rclk, dout); +parameter addr_width = 8; +parameter data_width = 8; +input [addr_width-1:0] waddr, raddr; +input [data_width-1:0] din; +input write_en, wclk, rclk; +output [data_width-1:0] dout; +reg [data_width-1:0] dout; +reg [data_width-1:0] mem [(1<<addr_width)-1:0] +/* synthesis syn_ramstyle = "no_rw_check" */ ; +always @(posedge wclk) // Write memory. +begin +if (write_en) +mem[waddr] <= din; // Using write address bus. +end +always @(posedge rclk) // Read memory. +begin +dout <= mem[raddr]; // Using read address bus. +end +endmodule diff --git a/tests/arch/ice40/dpram.ys b/tests/arch/ice40/dpram.ys new file mode 100644 index 000000000..4f6a253ea --- /dev/null +++ b/tests/arch/ice40/dpram.ys @@ -0,0 +1,15 @@ +read_verilog dpram.v +hierarchy -top top +proc +memory -nomap +equiv_opt -run :prove -map +/ice40/cells_sim.v synth_ice40 +memory +opt -full + +miter -equiv -flatten -make_assert -make_outputs gold gate miter +sat -verify -prove-asserts -seq 3 -set-init-zero -show-inputs -show-outputs miter + +design -load postopt +cd top +select -assert-count 1 t:SB_RAM40_4K +select -assert-none t:SB_RAM40_4K %% t:* %D diff --git a/tests/arch/ice40/fsm.v b/tests/arch/ice40/fsm.v new file mode 100644 index 000000000..0605bd102 --- /dev/null +++ b/tests/arch/ice40/fsm.v @@ -0,0 +1,73 @@ + module fsm (
 + clock,
 + reset,
 + req_0,
 + req_1,
 + gnt_0,
 + gnt_1
 + );
 + input   clock,reset,req_0,req_1;
 + output  gnt_0,gnt_1;
 + wire    clock,reset,req_0,req_1;
 + reg     gnt_0,gnt_1;
 +
 + parameter SIZE = 3           ;
 + parameter IDLE  = 3'b001,GNT0 = 3'b010,GNT1 = 3'b100,GNT2 = 3'b101 ;
 +
 + reg [SIZE-1:0] state;
 + reg [SIZE-1:0] next_state;
 +
 + always @ (posedge clock)
 + begin : FSM
 + if (reset == 1'b1) begin
 +   state <=  #1  IDLE;
 +   gnt_0 <= 0;
 +   gnt_1 <= 0;
 + end else
 +  case(state)
 +    IDLE : if (req_0 == 1'b1) begin
 +                 state <=  #1  GNT0;
 +                 gnt_0 <= 1;
 +               end else if (req_1 == 1'b1) begin
 +                 gnt_1 <= 1;
 +                 state <=  #1  GNT0;
 +               end else begin
 +                 state <=  #1  IDLE;
 +               end
 +    GNT0 : if (req_0 == 1'b1) begin
 +                 state <=  #1  GNT0;
 +               end else begin
 +                 gnt_0 <= 0;
 +                 state <=  #1  IDLE;
 +               end
 +    GNT1 : if (req_1 == 1'b1) begin
 +                 state <=  #1  GNT2;
 +				 gnt_1 <= req_0;
 +               end
 +    GNT2 : if (req_0 == 1'b1) begin
 +                 state <=  #1  GNT1;
 +				 gnt_1 <= req_1;
 +               end
 +    default : state <=  #1  IDLE;
 + endcase
 + end
 +
 + endmodule
 +
 + module top (
 +input clk,
 +input rst,
 +input a,
 +input b,
 +output g0,
 +output g1
 +);
 +
 +fsm u_fsm ( .clock(clk),
 +            .reset(rst),
 +            .req_0(a),
 +            .req_1(b),
 +            .gnt_0(g0),
 +            .gnt_1(g1));
 +
 +endmodule
 diff --git a/tests/arch/ice40/fsm.ys b/tests/arch/ice40/fsm.ys new file mode 100644 index 000000000..4cc8629d6 --- /dev/null +++ b/tests/arch/ice40/fsm.ys @@ -0,0 +1,13 @@ +read_verilog fsm.v +hierarchy -top top +proc +flatten +equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module + +select -assert-count 2 t:SB_DFFESR +select -assert-count 2 t:SB_DFFSR +select -assert-count 1 t:SB_DFFSS +select -assert-count 13 t:SB_LUT4 +select -assert-none t:SB_DFFESR t:SB_DFFSR t:SB_DFFSS t:SB_LUT4 %% t:* %D diff --git a/tests/arch/ice40/ice40_opt.ys b/tests/arch/ice40/ice40_opt.ys new file mode 100644 index 000000000..b17c69c91 --- /dev/null +++ b/tests/arch/ice40/ice40_opt.ys @@ -0,0 +1,26 @@ +read_verilog -icells -formal <<EOT +module top(input CI, I0, output [1:0] CO, output O); +    wire A = 1'b0, B = 1'b0; +	\$__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) +	) u0 ( +		.A(A), +		.B(B), +		.CI(CI), +		.I0(I0), +		.I3(CI), +		.CO(CO[0]), +		.O(O) +	); +    SB_CARRY u1 (.I0(~A), .I1(~B), .CI(CI), .CO(CO[1])); +endmodule +EOT + +equiv_opt -assert -map +/ice40/cells_map.v -map +/ice40/cells_sim.v ice40_opt +design -load postopt +select -assert-count 1 t:* +select -assert-count 1 t:$lut diff --git a/tests/arch/ice40/latches.v b/tests/arch/ice40/latches.v new file mode 100644 index 000000000..9dc43e4c2 --- /dev/null +++ b/tests/arch/ice40/latches.v @@ -0,0 +1,58 @@ +module latchp +    ( input d, clk, en, output reg q ); +	always @* +		if ( en ) +			q <= d; +endmodule + +module latchn +    ( input d, clk, en, output reg q ); +	always @* +		if ( !en ) +			q <= d; +endmodule + +module latchsr +    ( input d, clk, en, clr, pre, output reg q ); +	always @* +		if ( clr ) +			q <= 1'b0; +		else if ( pre ) +			q <= 1'b1; +		else if ( en ) +			q <= d; +endmodule + + +module top ( +input clk, +input clr, +input pre, +input a, +output b,b1,b2 +); + + +latchp u_latchp ( +        .en (clk ), +        .d (a ), +        .q (b ) +    ); + + +latchn u_latchn ( +        .en (clk ), +        .d (a ), +        .q (b1 ) +    ); + + +latchsr u_latchsr ( +        .en (clk ), +        .clr (clr), +        .pre (pre), +        .d (a ), +        .q (b2 ) +    ); + +endmodule diff --git a/tests/arch/ice40/latches.ys b/tests/arch/ice40/latches.ys new file mode 100644 index 000000000..708734e44 --- /dev/null +++ b/tests/arch/ice40/latches.ys @@ -0,0 +1,12 @@ +read_verilog latches.v + +proc +flatten +# Can't run any sort of equivalence check because latches are blown to LUTs +#equiv_opt -async2sync -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check + +#design -load preopt +synth_ice40 +cd top +select -assert-count 4 t:SB_LUT4 +select -assert-none t:SB_LUT4 %% t:* %D diff --git a/tests/arch/ice40/logic.v b/tests/arch/ice40/logic.v new file mode 100644 index 000000000..e5343cae0 --- /dev/null +++ b/tests/arch/ice40/logic.v @@ -0,0 +1,18 @@ +module top +( + input [0:7] in, + output B1,B2,B3,B4,B5,B6,B7,B8,B9,B10 + ); + +   assign     B1 =  in[0] & in[1]; +   assign     B2 =  in[0] | in[1]; +   assign     B3 =  in[0] ~& in[1]; +   assign     B4 =  in[0] ~| in[1]; +   assign     B5 =  in[0] ^ in[1]; +   assign     B6 =  in[0] ~^ in[1]; +   assign     B7 =  ~in[0]; +   assign     B8 =  in[0]; +   assign     B9 =  in[0:1] && in [2:3]; +   assign     B10 =  in[0:1] || in [2:3]; + +endmodule diff --git a/tests/arch/ice40/logic.ys b/tests/arch/ice40/logic.ys new file mode 100644 index 000000000..fc5e5b1d8 --- /dev/null +++ b/tests/arch/ice40/logic.ys @@ -0,0 +1,7 @@ +read_verilog logic.v +hierarchy -top top +equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 9 t:SB_LUT4 +select -assert-none t:SB_LUT4 %% t:* %D diff --git a/tests/arch/ice40/macc.v b/tests/arch/ice40/macc.v new file mode 100644 index 000000000..6f68e7500 --- /dev/null +++ b/tests/arch/ice40/macc.v @@ -0,0 +1,47 @@ +/* +Example from: https://www.latticesemi.com/-/media/LatticeSemi/Documents/UserManuals/EI/iCEcube201701UserGuide.ashx?document_id=52071 [p. 77]. +*/ +module top(clk,a,b,c,set); +parameter A_WIDTH = 6 /*4*/; +parameter B_WIDTH = 6 /*3*/; +input set; +input clk; +input signed [(A_WIDTH - 1):0] a; +input signed [(B_WIDTH - 1):0] b; +output signed [(A_WIDTH + B_WIDTH - 1):0] c; +reg [(A_WIDTH + B_WIDTH - 1):0] reg_tmp_c; +assign c = reg_tmp_c; +always @(posedge clk) +begin +    if(set) +    begin +        reg_tmp_c <= 0; +    end +    else +    begin +        reg_tmp_c <= a * b + c; +    end +end +endmodule + +module top2(clk,a,b,c,hold); +parameter A_WIDTH = 6 /*4*/; +parameter B_WIDTH = 6 /*3*/; +input hold; +input clk; +input signed [(A_WIDTH - 1):0] a; +input signed [(B_WIDTH - 1):0] b; +output signed [(A_WIDTH + B_WIDTH - 1):0] c; +reg signed [A_WIDTH-1:0] reg_a; +reg signed [B_WIDTH-1:0] reg_b; +reg [(A_WIDTH + B_WIDTH - 1):0] reg_tmp_c; +assign c = reg_tmp_c; +always @(posedge clk) +begin +    if (!hold) begin +        reg_a <= a; +        reg_b <= b; +        reg_tmp_c <= reg_a * reg_b + c; +    end +end +endmodule diff --git a/tests/arch/ice40/macc.ys b/tests/arch/ice40/macc.ys new file mode 100644 index 000000000..fd30e79c5 --- /dev/null +++ b/tests/arch/ice40/macc.ys @@ -0,0 +1,25 @@ +read_verilog macc.v +proc +design -save read + +hierarchy -top top +equiv_opt -assert -multiclock -map +/ice40/cells_sim.v synth_ice40 -dsp # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 1 t:SB_MAC16 +select -assert-none t:SB_MAC16 %% t:* %D + +design -load read +hierarchy -top top2 + +#equiv_opt -multiclock -assert -map +/ice40/cells_sim.v synth_ice40 -dsp # equivalency check + +equiv_opt -run :prove -multiclock -assert -map +/ice40/cells_sim.v synth_ice40 -dsp # equivalency check +clk2fflogic +miter -equiv -flatten -make_assert -make_outputs gold gate miter +sat -set-init-zero -seq 4 -verify -prove-asserts -show-ports miter + +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top2 # Constrain all select calls below inside the top module +select -assert-count 1 t:SB_MAC16 +select -assert-none t:SB_MAC16 %% t:* %D diff --git a/tests/arch/ice40/memory.v b/tests/arch/ice40/memory.v new file mode 100644 index 000000000..cb7753f7b --- /dev/null +++ b/tests/arch/ice40/memory.v @@ -0,0 +1,21 @@ +module top +( +	input [7:0] data_a, +	input [6:1] addr_a, +	input we_a, clk, +	output reg [7:0] q_a +); +	// Declare the RAM variable +	reg [7:0] ram[63:0]; + +	// Port A +	always @ (posedge clk) +	begin +		if (we_a) +		begin +			ram[addr_a] <= data_a; +			q_a <= data_a; +		end +		q_a <= ram[addr_a]; +	end +endmodule diff --git a/tests/arch/ice40/memory.ys b/tests/arch/ice40/memory.ys new file mode 100644 index 000000000..a66afbae6 --- /dev/null +++ b/tests/arch/ice40/memory.ys @@ -0,0 +1,15 @@ +read_verilog memory.v +hierarchy -top top +proc +memory -nomap +equiv_opt -run :prove -map +/ice40/cells_sim.v synth_ice40 +memory +opt -full + +miter -equiv -flatten -make_assert -make_outputs gold gate miter +sat -verify -prove-asserts -seq 5 -set-init-zero -show-inputs -show-outputs miter + +design -load postopt +cd top +select -assert-count 1 t:SB_RAM40_4K +select -assert-none t:SB_RAM40_4K %% t:* %D diff --git a/tests/arch/ice40/mul.v b/tests/arch/ice40/mul.v new file mode 100644 index 000000000..d5b48b1d7 --- /dev/null +++ b/tests/arch/ice40/mul.v @@ -0,0 +1,11 @@ +module top +( + input [5:0] x, + input [5:0] y, + + output [11:0] A, + ); + +assign A =  x * y; + +endmodule diff --git a/tests/arch/ice40/mul.ys b/tests/arch/ice40/mul.ys new file mode 100644 index 000000000..8a0822a84 --- /dev/null +++ b/tests/arch/ice40/mul.ys @@ -0,0 +1,7 @@ +read_verilog mul.v +hierarchy -top top +equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 -dsp # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 1 t:SB_MAC16 +select -assert-none t:SB_MAC16 %% t:* %D diff --git a/tests/arch/ice40/mux.v b/tests/arch/ice40/mux.v new file mode 100644 index 000000000..0814b733e --- /dev/null +++ b/tests/arch/ice40/mux.v @@ -0,0 +1,100 @@ +module mux2 (S,A,B,Y); +    input S; +    input A,B; +    output reg Y; + +    always @(*) +		Y = (S)? B : A; +endmodule + +module mux4 ( S, D, Y ); + +input[1:0] S; +input[3:0] D; +output Y; + +reg Y; +wire[1:0] S; +wire[3:0] D; + +always @* +begin +    case( S ) +       0 : Y = D[0]; +       1 : Y = D[1]; +       2 : Y = D[2]; +       3 : Y = D[3]; +   endcase +end + +endmodule + +module mux8 ( S, D, Y ); + +input[2:0] S; +input[7:0] D; +output Y; + +reg Y; +wire[2:0] S; +wire[7:0] D; + +always @* +begin +   case( S ) +       0 : Y = D[0]; +       1 : Y = D[1]; +       2 : Y = D[2]; +       3 : Y = D[3]; +       4 : Y = D[4]; +       5 : Y = D[5]; +       6 : Y = D[6]; +       7 : Y = D[7]; +   endcase +end + +endmodule + +module mux16 (D, S, Y); + 	input  [15:0] D; + 	input  [3:0] S; + 	output Y; + +assign Y = D[S]; + +endmodule + + +module top ( +input [3:0] S, +input [15:0] D, +output M2,M4,M8,M16 +); + +mux2 u_mux2 ( +        .S (S[0]), +        .A (D[0]), +        .B (D[1]), +        .Y (M2) +    ); + + +mux4 u_mux4 ( +        .S (S[1:0]), +        .D (D[3:0]), +        .Y (M4) +    ); + +mux8 u_mux8 ( +        .S (S[2:0]), +        .D (D[7:0]), +        .Y (M8) +    ); + +mux16 u_mux16 ( +        .S (S[3:0]), +        .D (D[15:0]), +        .Y (M16) +    ); + +endmodule diff --git a/tests/arch/ice40/mux.ys b/tests/arch/ice40/mux.ys new file mode 100644 index 000000000..182b49499 --- /dev/null +++ b/tests/arch/ice40/mux.ys @@ -0,0 +1,8 @@ +read_verilog mux.v +proc +flatten +equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 19 t:SB_LUT4 +select -assert-none t:SB_LUT4 %% t:* %D diff --git a/tests/arch/ice40/rom.v b/tests/arch/ice40/rom.v new file mode 100644 index 000000000..0a0f41f37 --- /dev/null +++ b/tests/arch/ice40/rom.v @@ -0,0 +1,18 @@ +/* +Example from: https://www.latticesemi.com/-/media/LatticeSemi/Documents/UserManuals/EI/iCEcube201701UserGuide.ashx?document_id=52071 [p. 74]. +*/ +module top(data, addr); +output [3:0] data; +input [4:0] addr; +always @(addr) begin +case (addr) +0 : data = 'h4; +1 : data = 'h9; +2 : data = 'h1; +15 : data = 'h8; +16 : data = 'h1; +17 : data = 'h0; +default : data = 'h0; +endcase +end +endmodule diff --git a/tests/arch/ice40/rom.ys b/tests/arch/ice40/rom.ys new file mode 100644 index 000000000..41d214e2a --- /dev/null +++ b/tests/arch/ice40/rom.ys @@ -0,0 +1,8 @@ +read_verilog rom.v +proc +flatten +equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 5 t:SB_LUT4 +select -assert-none t:SB_LUT4 %% t:* %D diff --git a/tests/arch/ice40/run-test.sh b/tests/arch/ice40/run-test.sh new file mode 100755 index 000000000..46716f9a0 --- /dev/null +++ b/tests/arch/ice40/run-test.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e +{ +echo "all::" +for x in *.ys; do +	echo "all:: run-$x" +	echo "run-$x:" +	echo "	@echo 'Running $x..'" +	echo "	@../../yosys -ql ${x%.ys}.log -w 'Yosys has only limited support for tri-state logic at the moment.' $x" +done +for s in *.sh; do +	if [ "$s" != "run-test.sh" ]; then +		echo "all:: run-$s" +		echo "run-$s:" +		echo "	@echo 'Running $s..'" +		echo "	@bash $s" +	fi +done +} > run-test.mk +exec ${MAKE:-make} -f run-test.mk diff --git a/tests/arch/ice40/shifter.v b/tests/arch/ice40/shifter.v new file mode 100644 index 000000000..c55632552 --- /dev/null +++ b/tests/arch/ice40/shifter.v @@ -0,0 +1,22 @@ +module top    (
 +out,
 +clk,
 +in
 +);
 +    output [7:0] out;
 +    input signed clk, in;
 +    reg signed [7:0] out = 0;
 +
 +    always @(posedge clk)
 +	begin
 +`ifndef BUG
 +		out    <= out >> 1;
 +		out[7] <= in;
 +`else
 +
 +		out    <= out << 1;
 +		out[7] <= in;
 +`endif
 +	end
 +
 +endmodule
 diff --git a/tests/arch/ice40/shifter.ys b/tests/arch/ice40/shifter.ys new file mode 100644 index 000000000..47d95d298 --- /dev/null +++ b/tests/arch/ice40/shifter.ys @@ -0,0 +1,9 @@ +read_verilog shifter.v +hierarchy -top top +proc +flatten +equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 8 t:SB_DFF +select -assert-none t:SB_DFF %% t:* %D diff --git a/tests/arch/ice40/tribuf.v b/tests/arch/ice40/tribuf.v new file mode 100644 index 000000000..870a02584 --- /dev/null +++ b/tests/arch/ice40/tribuf.v @@ -0,0 +1,23 @@ +module tristate (en, i, o); +    input en; +    input i; +    output o; + +	assign o = en ? i : 1'bz; + +endmodule + + +module top ( +input en, +input a, +output b +); + +tristate u_tri ( +        .en (en ), +        .i (a ), +        .o (b ) +    ); + +endmodule diff --git a/tests/arch/ice40/tribuf.ys b/tests/arch/ice40/tribuf.ys new file mode 100644 index 000000000..d1e1b3108 --- /dev/null +++ b/tests/arch/ice40/tribuf.ys @@ -0,0 +1,9 @@ +read_verilog tribuf.v +hierarchy -top top +proc +flatten +equiv_opt -assert -map +/ice40/cells_sim.v -map +/simcells.v synth_ice40 # equivalency check +design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design) +cd top # Constrain all select calls below inside the top module +select -assert-count 1 t:$_TBUF_ +select -assert-none t:$_TBUF_ %% t:* %D diff --git a/tests/arch/ice40/wrapcarry.ys b/tests/arch/ice40/wrapcarry.ys new file mode 100644 index 000000000..10c029e68 --- /dev/null +++ b/tests/arch/ice40/wrapcarry.ys @@ -0,0 +1,22 @@ +read_verilog <<EOT +module top(input A, B, CI, output O, CO); +	SB_CARRY carry ( +		.I0(A), +		.I1(B), +		.CI(CI), +		.CO(CO) +	); +	SB_LUT4 #( +		.LUT_INIT(16'b 0110_1001_1001_0110) +	) adder ( +		.I0(1'b0), +		.I1(A), +		.I2(B), +		.I3(1'b0), +		.O(O) +	); +endmodule +EOT + +ice40_wrapcarry +select -assert-count 1 t:$__ICE40_CARRY_WRAPPER | 
