diff options
| author | Eddie Hung <eddie@fpgeh.com> | 2019-09-03 10:49:21 -0700 | 
|---|---|---|
| committer | Eddie Hung <eddie@fpgeh.com> | 2019-09-03 10:49:21 -0700 | 
| commit | d6a84a78a7ca70e567bc1b0665751daf0e44f4ae (patch) | |
| tree | 131ecdaa9713cdcf31f5e5fe11aa86e877ac5103 /tests | |
| parent | 67587bad7fb1adf14ca9598bb1a01d0ffda6a018 (diff) | |
| parent | 58af64b63a3a253ab08b1410422677deac5c6618 (diff) | |
| download | yosys-d6a84a78a7ca70e567bc1b0665751daf0e44f4ae.tar.gz yosys-d6a84a78a7ca70e567bc1b0665751daf0e44f4ae.tar.bz2 yosys-d6a84a78a7ca70e567bc1b0665751daf0e44f4ae.zip | |
Merge remote-tracking branch 'origin/master' into eddie/deferred_top
Diffstat (limited to 'tests')
45 files changed, 1009 insertions, 36 deletions
| diff --git a/tests/ice40/.gitignore b/tests/ice40/.gitignore new file mode 100644 index 000000000..9a71dca69 --- /dev/null +++ b/tests/ice40/.gitignore @@ -0,0 +1,4 @@ +*.log +/run-test.mk ++*_synth.v ++*_testbench diff --git a/tests/ice40/add_sub.v b/tests/ice40/add_sub.v new file mode 100644 index 000000000..177c32e30 --- /dev/null +++ b/tests/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/ice40/add_sub.ys b/tests/ice40/add_sub.ys new file mode 100644 index 000000000..4a998d98d --- /dev/null +++ b/tests/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/ice40/adffs.v b/tests/ice40/adffs.v new file mode 100644 index 000000000..93c8bf52c --- /dev/null +++ b/tests/ice40/adffs.v @@ -0,0 +1,91 @@ +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 dffsr +    ( input d, clk, pre, clr, output reg q ); +    initial begin +      q = 0; +    end +	always @( posedge clk, posedge pre, posedge clr ) +		if ( clr ) +			q <= 1'b0; +		else if ( pre ) +			q <= 1'b1; +		else +            q <= d; +endmodule + +module ndffnsnr +    ( input d, clk, pre, clr, output reg q ); +    initial begin +      q = 0; +    end +	always @( negedge clk, negedge pre, negedge clr ) +		if ( !clr ) +			q <= 1'b0; +		else if ( !pre ) +			q <= 1'b1; +		else +            q <= d; +endmodule + +module top ( +input clk, +input clr, +input pre, +input a, +output b,b1,b2,b3 +); + +dffsr u_dffsr ( +        .clk (clk ), +        .clr (clr), +        .pre (pre), +        .d (a ), +        .q (b ) +    ); + +ndffnsnr u_ndffnsnr ( +        .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/ice40/adffs.ys b/tests/ice40/adffs.ys new file mode 100644 index 000000000..14b251c5c --- /dev/null +++ b/tests/ice40/adffs.ys @@ -0,0 +1,12 @@ +read_verilog adffs.v +proc +async2sync # converts async flops to a 'sync' variant clocked by a 'super'-clock +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_DFFN +select -assert-count 2 t:SB_DFFSR +select -assert-count 7 t:SB_LUT4 +select -assert-none t:SB_DFF t:SB_DFFN t:SB_DFFSR t:SB_LUT4 %% t:* %D diff --git a/tests/ice40/alu.v b/tests/ice40/alu.v new file mode 100644 index 000000000..f82cc2e21 --- /dev/null +++ b/tests/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/ice40/alu.ys b/tests/ice40/alu.ys new file mode 100644 index 000000000..bd859efc4 --- /dev/null +++ b/tests/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/ice40/counter.v b/tests/ice40/counter.v new file mode 100644 index 000000000..52852f8ac --- /dev/null +++ b/tests/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/ice40/counter.ys b/tests/ice40/counter.ys new file mode 100644 index 000000000..c65c21622 --- /dev/null +++ b/tests/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/ice40/dffs.v b/tests/ice40/dffs.v new file mode 100644 index 000000000..d97840c43 --- /dev/null +++ b/tests/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/ice40/dffs.ys b/tests/ice40/dffs.ys new file mode 100644 index 000000000..ee7f884b1 --- /dev/null +++ b/tests/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/ice40/div_mod.v b/tests/ice40/div_mod.v new file mode 100644 index 000000000..64a36707d --- /dev/null +++ b/tests/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/ice40/div_mod.ys b/tests/ice40/div_mod.ys new file mode 100644 index 000000000..21cac7144 --- /dev/null +++ b/tests/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 62 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/ice40/dpram.v b/tests/ice40/dpram.v new file mode 100644 index 000000000..3ea4c1f27 --- /dev/null +++ b/tests/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/ice40/dpram.ys b/tests/ice40/dpram.ys new file mode 100644 index 000000000..4f6a253ea --- /dev/null +++ b/tests/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/ice40/fsm.v b/tests/ice40/fsm.v new file mode 100644 index 000000000..0605bd102 --- /dev/null +++ b/tests/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/ice40/fsm.ys b/tests/ice40/fsm.ys new file mode 100644 index 000000000..4cc8629d6 --- /dev/null +++ b/tests/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/ice40/ice40_opt.ys b/tests/ice40/ice40_opt.ys new file mode 100644 index 000000000..b17c69c91 --- /dev/null +++ b/tests/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/ice40/latches.v b/tests/ice40/latches.v new file mode 100644 index 000000000..9dc43e4c2 --- /dev/null +++ b/tests/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/ice40/latches.ys b/tests/ice40/latches.ys new file mode 100644 index 000000000..f3562559e --- /dev/null +++ b/tests/ice40/latches.ys @@ -0,0 +1,15 @@ +read_verilog latches.v +design -save read + +proc +async2sync # converts latches to a 'sync' variant clocked by a 'super'-clock +flatten +synth_ice40 +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) + +design -load read +synth_ice40 +cd top +select -assert-count 4 t:SB_LUT4 +select -assert-none t:SB_LUT4 %% t:* %D diff --git a/tests/ice40/logic.v b/tests/ice40/logic.v new file mode 100644 index 000000000..e5343cae0 --- /dev/null +++ b/tests/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/ice40/logic.ys b/tests/ice40/logic.ys new file mode 100644 index 000000000..fc5e5b1d8 --- /dev/null +++ b/tests/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/ice40/macc.v b/tests/ice40/macc.v new file mode 100644 index 000000000..6c3676c83 --- /dev/null +++ b/tests/ice40/macc.v @@ -0,0 +1,25 @@ +/* +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 diff --git a/tests/ice40/macc.ys b/tests/ice40/macc.ys new file mode 100644 index 000000000..0f4c19be5 --- /dev/null +++ b/tests/ice40/macc.ys @@ -0,0 +1,13 @@ +read_verilog macc.v +proc +hierarchy -top top +#equiv_opt -assert -map +/ice40/cells_sim.v synth_ice40 -dsp # equivalency check + +equiv_opt -run :prove -map +/ice40/cells_sim.v synth_ice40 -dsp +async2sync +equiv_opt -run prove: -assert null + +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/ice40/memory.v b/tests/ice40/memory.v new file mode 100644 index 000000000..cb7753f7b --- /dev/null +++ b/tests/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/ice40/memory.ys b/tests/ice40/memory.ys new file mode 100644 index 000000000..a66afbae6 --- /dev/null +++ b/tests/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/ice40/mul.v b/tests/ice40/mul.v new file mode 100644 index 000000000..d5b48b1d7 --- /dev/null +++ b/tests/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/ice40/mul.ys b/tests/ice40/mul.ys new file mode 100644 index 000000000..8a0822a84 --- /dev/null +++ b/tests/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/ice40/mux.v b/tests/ice40/mux.v new file mode 100644 index 000000000..0814b733e --- /dev/null +++ b/tests/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/ice40/mux.ys b/tests/ice40/mux.ys new file mode 100644 index 000000000..182b49499 --- /dev/null +++ b/tests/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/ice40/rom.v b/tests/ice40/rom.v new file mode 100644 index 000000000..0a0f41f37 --- /dev/null +++ b/tests/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/ice40/rom.ys b/tests/ice40/rom.ys new file mode 100644 index 000000000..41d214e2a --- /dev/null +++ b/tests/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/ice40/run-test.sh b/tests/ice40/run-test.sh new file mode 100755 index 000000000..2c72ca3a9 --- /dev/null +++ b/tests/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 $x -w 'Yosys has only limited support for tri-state logic at the moment.'" +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/ice40/shifter.v b/tests/ice40/shifter.v new file mode 100644 index 000000000..c55632552 --- /dev/null +++ b/tests/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/ice40/shifter.ys b/tests/ice40/shifter.ys new file mode 100644 index 000000000..47d95d298 --- /dev/null +++ b/tests/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/ice40/tribuf.v b/tests/ice40/tribuf.v new file mode 100644 index 000000000..870a02584 --- /dev/null +++ b/tests/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/ice40/tribuf.ys b/tests/ice40/tribuf.ys new file mode 100644 index 000000000..d1e1b3108 --- /dev/null +++ b/tests/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/simple/run-test.sh b/tests/simple/run-test.sh index 967ac49f2..f20fd0d30 100755 --- a/tests/simple/run-test.sh +++ b/tests/simple/run-test.sh @@ -12,7 +12,7 @@ done  shift "$((OPTIND-1))"  # check for Icarus Verilog -if ! which iverilog > /dev/null ; then +if ! command -v iverilog > /dev/null ; then    echo "$0: Error: Icarus Verilog 'iverilog' not found."    exit 1  fi diff --git a/tests/simple_abc9/run-test.sh b/tests/simple_abc9/run-test.sh index 49ae23338..0d4262005 100755 --- a/tests/simple_abc9/run-test.sh +++ b/tests/simple_abc9/run-test.sh @@ -12,7 +12,7 @@ done  shift "$((OPTIND-1))"  # check for Icarus Verilog -if ! which iverilog > /dev/null ; then +if ! command -v iverilog > /dev/null ; then    echo "$0: Error: Icarus Verilog 'iverilog' not found."    exit 1  fi @@ -20,4 +20,10 @@ fi  cp ../simple/*.v .  cp ../simple/*.sv .  DOLLAR='?' -exec ${MAKE:-make} -f ../tools/autotest.mk $seed *.v EXTRA_FLAGS="-n 300 -p 'hierarchy; synth -run coarse; opt -full; techmap; abc9 -lut 4 -box ../abc.box; stat; check -assert; select -assert-none t:${DOLLAR}_NOT_ t:${DOLLAR}_AND_ %%'" +exec ${MAKE:-make} -f ../tools/autotest.mk $seed *.v EXTRA_FLAGS="-n 300 -p '\ +    hierarchy; \ +    synth -run coarse; \ +    opt -full; \ +    techmap; abc9 -lut 4 -box ../abc.box; \ +    check -assert; \ +    select -assert-none t:${DOLLAR}_NOT_ t:${DOLLAR}_AND_ %%'" diff --git a/tests/various/shregmap.ys b/tests/various/shregmap.ys index 0e5fe882b..16e5f40e1 100644 --- a/tests/various/shregmap.ys +++ b/tests/various/shregmap.ys @@ -31,36 +31,3 @@ sat -verify -prove-asserts -show-ports -seq 5 miter  #design -load gate  #stat - -########## - -design -load read -design -copy-to model $__XILINX_SHREG_ -hierarchy -top shregmap_variable_test -prep -design -save gold - -simplemap t:$dff t:$dffe -shregmap -tech xilinx - -#stat -# show -width -# write_verilog -noexpr -norename -select -assert-count 1 t:$_DFF_P_ -select -assert-count 2 t:$__XILINX_SHREG_ - -design -stash gate - -design -import gold -as gold -design -import gate -as gate -design -copy-from model -as $__XILINX_SHREG_ \$__XILINX_SHREG_ -prep - -miter -equiv -flatten -make_assert -make_outputs gold gate miter -sat -verify -prove-asserts -show-ports -seq 5 miter - -# design -load gold -# stat - -# design -load gate -# stat diff --git a/tests/xilinx/.gitignore b/tests/xilinx/.gitignore new file mode 100644 index 000000000..b48f808a1 --- /dev/null +++ b/tests/xilinx/.gitignore @@ -0,0 +1,3 @@ +/*.log +/*.out +/run-test.mk diff --git a/tests/xilinx/pmgen_xilinx_srl.ys b/tests/xilinx/pmgen_xilinx_srl.ys new file mode 100644 index 000000000..ea2f20487 --- /dev/null +++ b/tests/xilinx/pmgen_xilinx_srl.ys @@ -0,0 +1,57 @@ +read_verilog -icells <<EOT +module \$__XILINX_SHREG_ (input C, input D, input [31:0] L, input E, output Q, output SO); +  parameter DEPTH = 1; +  parameter [DEPTH-1:0] INIT = 0; +  parameter CLKPOL = 1; +  parameter ENPOL = 2; + +  wire pos_clk = C == CLKPOL; +  reg pos_en; +  always @(E) +    if (ENPOL == 2) pos_en = 1'b1; +    else pos_en = (E == ENPOL[0]); + +  reg [DEPTH-1:0] r; +  always @(posedge pos_clk) +    if (pos_en) +      r <= {r[DEPTH-2:0], D}; + +  assign Q = r[L]; +  assign SO = r[DEPTH-1]; +endmodule +EOT +read_verilog +/xilinx/cells_sim.v +proc +design -save model + +test_pmgen -generate xilinx_srl.fixed +hierarchy -top pmtest_xilinx_srl_pm_fixed +flatten; opt_clean + +design -save gold +xilinx_srl -fixed +techmap -autoproc -map %model +design -stash gate + +design -copy-from gold -as gold pmtest_xilinx_srl_pm_fixed +design -copy-from gate -as gate pmtest_xilinx_srl_pm_fixed +dff2dffe -unmap # sat does not support flops-with-enable yet +miter -equiv -flatten -make_assert gold gate miter +sat -set-init-zero -seq 5 -verify -prove-asserts miter + +design -load model + +test_pmgen -generate xilinx_srl.variable +hierarchy -top pmtest_xilinx_srl_pm_variable +flatten; opt_clean + +design -save gold +xilinx_srl -variable +techmap -autoproc -map %model +design -stash gate + +design -copy-from gold -as gold pmtest_xilinx_srl_pm_variable +design -copy-from gate -as gate pmtest_xilinx_srl_pm_variable +dff2dffe -unmap # sat does not support flops-with-enable yet +miter -equiv -flatten -make_assert gold gate miter +sat -set-init-zero -seq 5 -verify -prove-asserts miter diff --git a/tests/xilinx/run-test.sh b/tests/xilinx/run-test.sh new file mode 100755 index 000000000..ea56b70f0 --- /dev/null +++ b/tests/xilinx/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 $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/xilinx/xilinx_srl.v b/tests/xilinx/xilinx_srl.v new file mode 100644 index 000000000..bc2a15ab2 --- /dev/null +++ b/tests/xilinx/xilinx_srl.v @@ -0,0 +1,40 @@ +module xilinx_srl_static_test(input i, clk, output [1:0] q); +reg head = 1'b0; +reg [3:0] shift1 = 4'b0000; +reg [3:0] shift2 = 4'b0000; + +always @(posedge clk) begin +    head <= i; +    shift1 <= {shift1[2:0], head}; +    shift2 <= {shift2[2:0], head}; +end + +assign q = {shift2[3], shift1[3]}; +endmodule + +module xilinx_srl_variable_test(input i, clk, input [1:0] l1, l2, output [1:0] q); +reg head = 1'b0; +reg [3:0] shift1 = 4'b0000; +reg [3:0] shift2 = 4'b0000; + +always @(posedge clk) begin +    head <= i; +    shift1 <= {shift1[2:0], head}; +    shift2 <= {shift2[2:0], head}; +end + +assign q = {shift2[l2], shift1[l1]}; +endmodule + +module $__XILINX_SHREG_(input C, D, E, input [1:0] L, output Q); +parameter CLKPOL = 1; +parameter ENPOL = 1; +parameter DEPTH = 1; +parameter [DEPTH-1:0] INIT = {DEPTH{1'b0}}; +reg [DEPTH-1:0] r = INIT; +wire clk = C ^ CLKPOL; +always @(posedge C) +    if (E)  +        r <= { r[DEPTH-2:0], D }; +assign Q = r[L]; +endmodule diff --git a/tests/xilinx/xilinx_srl.ys b/tests/xilinx/xilinx_srl.ys new file mode 100644 index 000000000..b8df0e55a --- /dev/null +++ b/tests/xilinx/xilinx_srl.ys @@ -0,0 +1,67 @@ +read_verilog xilinx_srl.v +design -save read + +design -copy-to model $__XILINX_SHREG_ +hierarchy -top xilinx_srl_static_test +prep +design -save gold + +techmap +xilinx_srl -fixed +opt + +# stat +# show -width +select -assert-count 1 t:$_DFF_P_ +select -assert-count 2 t:$__XILINX_SHREG_ + +design -stash gate + +design -import gold -as gold +design -import gate -as gate +design -copy-from model -as $__XILINX_SHREG_ \$__XILINX_SHREG_ +prep + +miter -equiv -flatten -make_assert -make_outputs gold gate miter +dump gate +sat -verify -prove-asserts -show-ports -seq 5 miter + +#design -load gold +#stat + +#design -load gate +#stat + +########## + +design -load read +design -copy-to model $__XILINX_SHREG_ +hierarchy -top xilinx_srl_variable_test +prep +design -save gold + +xilinx_srl -variable +opt + +#stat +# show -width +# write_verilog -noexpr -norename +select -assert-count 1 t:$dff +select -assert-count 1 t:$dff r:WIDTH=1 %i +select -assert-count 2 t:$__XILINX_SHREG_ + +design -stash gate + +design -import gold -as gold +design -import gate -as gate +design -copy-from model -as $__XILINX_SHREG_ \$__XILINX_SHREG_ +prep + +miter -equiv -flatten -make_assert -make_outputs gold gate miter +sat -verify -prove-asserts -show-ports -seq 5 miter + +# design -load gold +# stat + +# design -load gate +# stat | 
