yosys/tests/opt/opt_expr_cmp_msb.v

51 lines
1.6 KiB
Verilog

module top(
a, b, x,
o1_1, o1_2, o1_3, o1_4,
o2_1, o2_2, o2_3, o2_4,
o3_1, o3_2, o3_3, o3_4,
o4_1, o4_2, o4_3, o4_4,
o5_1, o5_2, o5_3, o5_4
);
input [3:0] a;
input b;
input [7:0] x;
output o1_1, o1_2, o1_3, o1_4;
output o2_1, o2_2, o2_3, o2_4;
output o3_1, o3_2, o3_3, o3_4;
output o4_1, o4_2, o4_3, o4_4;
output o5_1, o5_2, o5_3, o5_4;
// RHS = {b, 4'b0000}: same width as `a`, lower bits zero.
assign o1_1 = a < {b, 4'b0000};
assign o1_2 = a >= {b, 4'b0000};
assign o1_3 = {b, 4'b0000} > a;
assign o1_4 = {b, 4'b0000} <= a;
// RHS = {b, 5'b00000}: wider than `a`; `a` zero-extends to fit.
assign o2_1 = a < {b, 5'b00000};
assign o2_2 = a >= {b, 5'b00000};
assign o2_3 = {b, 5'b00000} > a;
assign o2_4 = {b, 5'b00000} <= a;
// LHS = {1'b0, a}: explicit zero-extend on the bounded operand.
assign o3_1 = {1'b0, a} < {b, 4'b0000};
assign o3_2 = {1'b0, a} >= {b, 4'b0000};
assign o3_3 = {b, 4'b0000} > {1'b0, a};
assign o3_4 = {b, 4'b0000} <= {1'b0, a};
// Lowered form of `(signed x < -1)` after sign-stripping:
// A = {1'b1, x[N-2:0]}, B = {x[N-1], (N-1)'b1}, both unsigned.
// Expected: Y = x[N-1] && ~&x[N-2:0]
assign o4_1 = {1'b1, x[6:0]} < {x[7], 7'b1111111};
assign o4_2 = {1'b1, x[6:0]} >= {x[7], 7'b1111111};
assign o4_3 = {x[7], 7'b1111111} > {1'b1, x[6:0]};
assign o4_4 = {x[7], 7'b1111111} <= {1'b1, x[6:0]};
// Same pattern at width = 2 (smallest viable N).
assign o5_1 = {1'b1, x[0]} < {x[1], 1'b1};
assign o5_2 = {1'b1, x[0]} >= {x[1], 1'b1};
assign o5_3 = {x[1], 1'b1} > {1'b1, x[0]};
assign o5_4 = {x[1], 1'b1} <= {1'b1, x[0]};
endmodule