| `timescale 1 ns / 1 ps |
| `default_nettype none |
| |
| `ifndef VCDFILE |
| `define VCDFILE "testbench_lcu_tb.vcd" |
| `endif |
| |
| module tb; |
| |
| `include "../../../../library/tbassert.v" |
| |
| // ============================================================================ |
| |
| reg clk; |
| reg thresh_sw; |
| |
| reg [31:0] threshold, threshold_down, counter, counter_down; |
| |
| initial clk <= 1'd0; |
| initial thresh_sw <= 1'd0; |
| initial threshold <= 32'd0; |
| initial threshold_down <= 32'd0; |
| initial counter <= 32'd0; |
| initial counter_down <= 32'd0; |
| always #5 clk <= !clk; |
| always #500 thresh_sw <= !thresh_sw; |
| |
| initial begin |
| $dumpfile(`VCDFILE); |
| $dumpvars; |
| #500000 $finish(); |
| end |
| |
| // ============================================================================ |
| // DUT |
| wire gtu, gts, ltu, lts, geu, ges, leu, les, zero, max; |
| wire gtu_n, gts_n, ltu_n, lts_n, geu_n, ges_n, leu_n, les_n, zero_n, max_n; |
| |
| |
| top dut |
| ( |
| .count (clk), |
| .count_sw (thresh_sw), |
| .thresh_sw (thresh_sw), |
| .gtu (gtu), |
| .gts (gts), |
| .ltu (ltu), |
| .lts (lts), |
| .geu (geu), |
| .ges (ges), |
| .leu (leu), |
| .les (les), |
| .zero (zero), |
| .max (max), |
| .gtu_n (gtu_n), |
| .gts_n (gts_n), |
| .ltu_n (ltu_n), |
| .lts_n (lts_n), |
| .geu_n (geu_n), |
| .ges_n (ges_n), |
| .leu_n (leu_n), |
| .les_n (les_n), |
| .zero_n (zero_n), |
| .max_n (max_n) |
| ); |
| |
| always @(posedge clk) begin |
| |
| if (thresh_sw) begin |
| counter <= counter + 1; |
| counter_down <= counter_down - 1; |
| threshold <= counter - 32'd31; |
| threshold_down <= counter_down + 32'd31; |
| end else begin |
| threshold <= threshold + 1; |
| threshold_down <= threshold_down - 1; |
| end |
| |
| tbassert((counter == 32'b0) == zero, counter); |
| tbassert((counter == 32'hFFFFFFFF) == max, counter); |
| tbassert((counter > threshold) == gtu, gtu); |
| tbassert(($signed(counter) > $signed(threshold)) == gts, gts); |
| tbassert((counter < threshold) == ltu, ltu); |
| tbassert(($signed(counter) < $signed(threshold)) == lts, lts); |
| tbassert((counter >= threshold) == geu, geu); |
| tbassert(($signed(counter) >= $signed(threshold)) == ges, ges); |
| tbassert((counter <= threshold) == leu, leu); |
| tbassert(($signed(counter) <= $signed(threshold)) == les, les); |
| |
| |
| tbassert((counter_down == 32'b0) == zero_n, counter); |
| tbassert((counter_down == 32'hFFFFFFFF) == max_n, counter); |
| tbassert((counter_down > threshold_down) == gtu_n, gtu_n); |
| tbassert(($signed(counter_down) > $signed(threshold_down)) == gts_n, gts_n); |
| tbassert((counter_down < threshold_down) == ltu_n, ltu_n); |
| tbassert(($signed(counter_down) < $signed(threshold_down)) == lts_n, lts_n); |
| tbassert((counter_down >= threshold_down) == geu_n, geu_n); |
| tbassert(($signed(counter_down) >= $signed(threshold_down)) == ges_n, ges_n); |
| tbassert((counter_down <= threshold_down) == leu_n, leu_n); |
| tbassert(($signed(counter_down) <= $signed(threshold_down)) == les_n, les_n); |
| end |
| |
| // ============================================================================ |
| |
| endmodule |
| |