log -header "Positive: mbase MSB one-hot (8'b1000_0000), shiftamt 3 bits" log -push design -reset read_verilog <> shiftamt); endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt opt_clean select -assert-count 0 t:$mod select -assert-count 1 t:$and select -assert-count 1 t:$shr design -reset log -pop log -header "Positive: mbase non-MSB one-hot (8'b0010_0000)" log -push design -reset read_verilog <> shiftamt); endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt opt_clean select -assert-count 0 t:$mod select -assert-count 1 t:$and select -assert-count 1 t:$shr design -reset log -pop log -header "Positive: shiftamt clog2(N) bits, divisor never zero (mbase = 1<<(N-1))" log -push design -reset read_verilog <> shiftamt); endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt opt_clean select -assert-count 0 t:$mod select -assert-count 1 t:$and select -assert-count 1 t:$shr design -reset log -pop log -header "Positive: low-position one-hot, shiftamt bounded so divisor != 0" log -push design -reset read_verilog <> shiftamt); endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt opt_clean select -assert-count 0 t:$mod select -assert-count 1 t:$and select -assert-count 1 t:$shr design -reset log -pop log -header "Positive: wider mbase than a, shiftamt sized so divisor != 0" log -push design -reset read_verilog <> shiftamt); endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt opt_clean select -assert-count 0 t:$mod select -assert-count 1 t:$and select -assert-count 1 t:$shr design -reset log -pop log -header "Positive: \$shr A_SIGNED=1 (signed parameter), Y wider than mod->B" log -push design -reset read_verilog -sv <> shiftamt) in {32,16,8,4} -- never zero. parameter FIFO_DEPTH = 32; wire [5:0] divisor = FIFO_DEPTH >> shiftamt; assign y = a % divisor; endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt opt_clean select -assert-count 0 t:$mod select -assert-count 1 t:$and select -assert-count 1 t:$shr design -reset log -pop log -header "Positive: shared shifter Y fans out to many \$mod cells (generate loop)" log -push design -reset read_verilog -sv <> shiftamt; assign y0 = a0 % divisor; assign y1 = a1 % divisor; assign y2 = a2 % divisor; assign y3 = a3 % divisor; endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt opt_clean select -assert-count 0 t:$mod select -assert-count 4 t:$and # 4 mask shifters + 1 original (still drives the shared divisor wire # whose remaining bits may be dead). opt_clean keeps the original # while any of its Y bits has a name attached; check >= 4 shifters. select -assert-min 4 t:$shr design -reset log -pop log -header "Positive: rewrite still applied even when divisor can be 0; assert via peepopt only" log -push design -reset read_verilog <> shiftamt); endmodule EOT check -assert peepopt opt_clean select -assert-count 0 t:$mod select -assert-count 1 t:$and select -assert-count 1 t:$shr design -reset log -pop log -header "Negative: mbase is NOT one-hot (8'b0011_0000)" log -push design -reset read_verilog <> shiftamt); endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt select -assert-count 1 t:$mod select -assert-count 0 t:$and design -reset log -pop log -header "Negative: mbase is a wire (not constant) -- pattern must not match" log -push design -reset read_verilog <> shiftamt); endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt select -assert-count 1 t:$mod design -reset log -pop log -header "Negative: signed dividend (A_SIGNED=1 on $mod)" log -push design -reset read_verilog <> shiftamt); endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt select -assert-count 1 t:$mod design -reset log -pop log -header "Negative: shifter is $shl (left shift) -- not the right pattern" log -push design -reset read_verilog <> shiftamt; assign y = a % divisor; assign probe = divisor; endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt opt_clean # The original $shr must be preserved because it drives \probe; the # rewrite only retargets the $mod, replacing it with $and + a new mask # shifter. select -assert-count 0 t:$mod select -assert-count 1 t:$and select -assert-count 2 t:$shr design -reset log -pop log -header "Negative: B_SIGNED=1 on $mod with one-hot at MSB of mbase" log -push design -reset read_verilog <>> shiftamt; assign y = a % divisor; endmodule EOT check -assert equiv_opt -assert peepopt design -load postopt select -assert-count 1 t:$mod design -reset log -pop