mirror of
https://github.com/YosysHQ/yosys
synced 2025-07-30 16:03:17 +00:00
Merge pull request #5141 from garytwong/unique-if
Accept (and ignore) SystemVerilog unique/priority if.
This commit is contained in:
commit
489a12d6c1
9 changed files with 189 additions and 2 deletions
41
tests/verilog/priority_if_enc.ys
Normal file
41
tests/verilog/priority_if_enc.ys
Normal file
|
@ -0,0 +1,41 @@
|
|||
logger -expect log "SAT proof finished - no model found: SUCCESS" 1
|
||||
|
||||
read_verilog -sv <<EOF
|
||||
// A somewhat contrived model of an encoder, relying on SystemVerilog's
|
||||
// strong "if" semantics to guarantee priority encoder behaviour.
|
||||
module encoder( input [ 2:0 ] x, output reg [ 1:0 ] y );
|
||||
always_comb begin
|
||||
y = 2'b00;
|
||||
|
||||
if( x[ 2 ] ) y = 2'b11;
|
||||
else if( x[ 1 ] ) y = 2'b10;
|
||||
else if( x[ 0 ] ) y = 2'b01;
|
||||
end
|
||||
endmodule
|
||||
|
||||
// Almost the same thing, but by using "priority if" we introduce
|
||||
// "don't care" states, essentially conveying permission to synthesise
|
||||
// a simple encoder instead.
|
||||
module dut( input [ 2:0 ] x, output reg [ 1:0 ] y );
|
||||
always_comb begin
|
||||
y = 2'b00;
|
||||
|
||||
priority if( x[ 2 ] ) y = 2'b11;
|
||||
else if( x[ 1 ] ) y = 2'b10;
|
||||
else if( x[ 0 ] ) y = 2'b01;
|
||||
end
|
||||
endmodule
|
||||
|
||||
// A simple test bench to detect mismatches between the two encoders.
|
||||
module compare_encoders( input [ 2:0 ] x, output ok );
|
||||
wire [ 1:0 ] encout;
|
||||
wire [ 1:0 ] dutout;
|
||||
encoder e( x, encout );
|
||||
dut d( x, dutout );
|
||||
// The "priority if" above assumes $countones( x ) > 0.
|
||||
assign ok = encout == dutout || !$countones( x );
|
||||
endmodule
|
||||
EOF
|
||||
|
||||
synth -flatten -top compare_encoders
|
||||
sat -prove ok 1
|
41
tests/verilog/unique0_if_enc.ys
Normal file
41
tests/verilog/unique0_if_enc.ys
Normal file
|
@ -0,0 +1,41 @@
|
|||
logger -expect log "SAT proof finished - no model found: SUCCESS" 1
|
||||
|
||||
read_verilog -sv <<EOF
|
||||
// A somewhat contrived model of an encoder, relying on SystemVerilog's
|
||||
// strong "if" semantics to guarantee priority encoder behaviour.
|
||||
module encoder( input [ 2:0 ] x, output reg [ 1:0 ] y );
|
||||
always_comb begin
|
||||
y = 2'b00;
|
||||
|
||||
if( x[ 2 ] ) y = 2'b11;
|
||||
else if( x[ 1 ] ) y = 2'b10;
|
||||
else if( x[ 0 ] ) y = 2'b01;
|
||||
end
|
||||
endmodule
|
||||
|
||||
// Almost the same thing, but by using "unique0 if" we introduce
|
||||
// "don't care" states, essentially conveying permission to synthesise
|
||||
// a simple encoder instead.
|
||||
module dut( input [ 2:0 ] x, output reg [ 1:0 ] y );
|
||||
always_comb begin
|
||||
y = 2'b00;
|
||||
|
||||
unique0 if( x[ 2 ] ) y = 2'b11;
|
||||
else if( x[ 1 ] ) y = 2'b10;
|
||||
else if( x[ 0 ] ) y = 2'b01;
|
||||
end
|
||||
endmodule
|
||||
|
||||
// A simple test bench to detect mismatches between the two encoders.
|
||||
module compare_encoders( input [ 2:0 ] x, output ok );
|
||||
wire [ 1:0 ] encout;
|
||||
wire [ 1:0 ] dutout;
|
||||
encoder e( x, encout );
|
||||
dut d( x, dutout );
|
||||
// The "unique0 if" above assumes $onehot0( x ).
|
||||
assign ok = encout == dutout || !$onehot0( x );
|
||||
endmodule
|
||||
EOF
|
||||
|
||||
synth -flatten -top compare_encoders
|
||||
sat -prove ok 1
|
10
tests/verilog/unique_if.ys
Normal file
10
tests/verilog/unique_if.ys
Normal file
|
@ -0,0 +1,10 @@
|
|||
read_verilog -sv <<EOF
|
||||
module top( input[2:0] a );
|
||||
always_comb begin
|
||||
// example from 1800-2012 12.4.2
|
||||
unique if ((a==0) || (a==1)) $display("0 or 1");
|
||||
else if (a == 2) $display("2");
|
||||
else if (a == 4) $display("4");
|
||||
end
|
||||
endmodule
|
||||
EOF
|
11
tests/verilog/unique_if_else.ys
Normal file
11
tests/verilog/unique_if_else.ys
Normal file
|
@ -0,0 +1,11 @@
|
|||
logger -expect error "unique keyword cannot be used for 'else if' branch" 1
|
||||
read_verilog -sv <<EOF
|
||||
module top( input[2:0] a );
|
||||
always_comb begin
|
||||
// invalid example from 1800-2012 12.4.2
|
||||
unique if ((a==0) || (a==1)) $display("0 or 1");
|
||||
else unique if (a == 2) $display("2");
|
||||
else if (a == 4) $display("4");
|
||||
end
|
||||
endmodule
|
||||
EOF
|
12
tests/verilog/unique_if_else_begin.ys
Normal file
12
tests/verilog/unique_if_else_begin.ys
Normal file
|
@ -0,0 +1,12 @@
|
|||
read_verilog -sv <<EOF
|
||||
module top( input[2:0] a );
|
||||
always_comb begin
|
||||
// example from 1800-2012 12.4.2
|
||||
unique if ((a==0) || (a==1)) $display("0 or 1");
|
||||
else begin
|
||||
unique if (a == 2) $display("2");
|
||||
else if (a == 4) $display("4");
|
||||
end
|
||||
end
|
||||
endmodule
|
||||
EOF
|
41
tests/verilog/unique_if_enc.ys
Normal file
41
tests/verilog/unique_if_enc.ys
Normal file
|
@ -0,0 +1,41 @@
|
|||
logger -expect log "SAT proof finished - no model found: SUCCESS" 1
|
||||
|
||||
read_verilog -sv <<EOF
|
||||
// A somewhat contrived model of an encoder, relying on SystemVerilog's
|
||||
// strong "if" semantics to guarantee priority encoder behaviour.
|
||||
module encoder( input [ 2:0 ] x, output reg [ 1:0 ] y );
|
||||
always_comb begin
|
||||
y = 2'b00;
|
||||
|
||||
if( x[ 2 ] ) y = 2'b11;
|
||||
else if( x[ 1 ] ) y = 2'b10;
|
||||
else if( x[ 0 ] ) y = 2'b01;
|
||||
end
|
||||
endmodule
|
||||
|
||||
// Almost the same thing, but by using "unique if" we introduce
|
||||
// "don't care" states, essentially conveying permission to synthesise
|
||||
// a simple encoder instead.
|
||||
module dut( input [ 2:0 ] x, output reg [ 1:0 ] y );
|
||||
always_comb begin
|
||||
y = 2'b00;
|
||||
|
||||
unique if( x[ 2 ] ) y = 2'b11;
|
||||
else if( x[ 1 ] ) y = 2'b10;
|
||||
else if( x[ 0 ] ) y = 2'b01;
|
||||
end
|
||||
endmodule
|
||||
|
||||
// A simple test bench to detect mismatches between the two encoders.
|
||||
module compare_encoders( input [ 2:0 ] x, output ok );
|
||||
wire [ 1:0 ] encout;
|
||||
wire [ 1:0 ] dutout;
|
||||
encoder e( x, encout );
|
||||
dut d( x, dutout );
|
||||
// The "unique if" above assumes $onehot( x ).
|
||||
assign ok = encout == dutout || !$onehot( x );
|
||||
endmodule
|
||||
EOF
|
||||
|
||||
synth -flatten -top compare_encoders
|
||||
sat -prove ok 1
|
Loading…
Add table
Add a link
Reference in a new issue