blob: 3d170ed4702f7215e1cc47f275b2730156ac6bd0 [file] [log] [blame] [edit]
`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