diff --git a/lib/bh_assert.sv b/lib/bh_assert.sv index 1de2753..4d79268 100644 --- a/lib/bh_assert.sv +++ b/lib/bh_assert.sv @@ -1,69 +1,67 @@ `timescale 1ns/1ps package bh_assert; + int bh_assert_pass_count = 0; + int bh_assert_fail_count = 0; + int bh_assert_warn_count = 0; -int bh_assert_pass_count = 0; -int bh_assert_fail_count = 0; -int bh_assert_warn_count = 0; + localparam BH_ASSERT_LOG_LEVEL_FAIL = 0; + localparam BH_ASSERT_LOG_LEVEL_ASSERT = 1; + localparam BH_ASSERT_LOG_LEVEL_WARN = 2; + localparam BH_ASSERT_LOG_LEVEL_INFO = 3; -localparam BH_ASSERT_LOG_LEVEL_FAIL = 0; -localparam BH_ASSERT_LOG_LEVEL_ASSERT = 1; -localparam BH_ASSERT_LOG_LEVEL_WARN = 2; -localparam BH_ASSERT_LOG_LEVEL_INFO = 3; + logic bh_assert_log_level = BH_ASSERT_LOG_LEVEL_WARN; // 0 = errors only, 1 = all assertions, 2 = warnings, 3 = info -logic bh_assert_log_level = BH_ASSERT_LOG_LEVEL_WARN; // 0 = errors only, 1 = all assertions, 2 = warnings, 3 = info + localparam COLOR_RED = "\033[31m"; + localparam COLOR_YELLOW = "\033[33m"; + localparam COLOR_GREEN = "\033[32m"; + localparam COLOR_NORMAL = "\033[0;39m"; -localparam COLOR_RED = "\033[31m"; -localparam COLOR_YELLOW = "\033[33m"; -localparam COLOR_GREEN = "\033[32m"; -localparam COLOR_NORMAL = "\033[0;39m"; + task bh_assert_equal(int val, int expected, string description); + // display results + $timeformat(-9, 2, " ns", 20); + $display( + "%t: %s: %d %s %d - %s", + $time, + val == expected ? {COLOR_GREEN, "PASS", COLOR_NORMAL} : {COLOR_RED, "FAIL", COLOR_NORMAL}, + val, + val == expected ? "==" : "!=", + expected, + description + ); -task bh_assert_equal(int val, int expected, string description); - // display results - $timeformat(-9, 2, " ns", 20); - $display( - "%t: %s: %d %s %d - %s", - $time, - val == expected ? {COLOR_GREEN, "PASS", COLOR_NORMAL} : {COLOR_RED, "FAIL", COLOR_NORMAL}, - val, - val == expected ? "==" : "!=", - expected, - description - ); + // update statistics + if (val == expected) begin + bh_assert_pass_count = bh_assert_pass_count + 1; + end else begin + bh_assert_fail_count = bh_assert_fail_count + 1; + end + endtask - // update statistics - if (val == expected) begin - bh_assert_pass_count = bh_assert_pass_count + 1; - end else begin - bh_assert_fail_count = bh_assert_fail_count + 1; - end -endtask + task bh_assert_stats; + $timeformat(-9, 2, " ns", 20); + $display("%t: DONE: %1d pass, %1d fail, %1d warn", $time, bh_assert_pass_count, bh_assert_fail_count, bh_assert_warn_count); + if (bh_assert_pass_count + bh_assert_fail_count == 0) begin + $display("%sERROR%s: no assertions found", COLOR_YELLOW, COLOR_NORMAL); + // TODO: error in a better way? + end else if (bh_assert_fail_count > 0) begin + $display("%sERROR%s: some tests failed", COLOR_RED, COLOR_NORMAL); + end else begin + $display("%sSUCCESS%s: all tests passed", COLOR_GREEN, COLOR_NORMAL); + end + endtask -task bh_assert_stats; - $timeformat(-9, 2, " ns", 20); - $display("%t: DONE: %1d pass, %1d fail, %1d warn", $time, bh_assert_pass_count, bh_assert_fail_count, bh_assert_warn_count); - if (bh_assert_pass_count + bh_assert_fail_count == 0) begin - $display("%sERROR%s: no assertions found", COLOR_YELLOW, COLOR_NORMAL); - // TODO: error in a better way? - end else if (bh_assert_fail_count > 0) begin - $display("%sERROR%s: some tests failed", COLOR_RED, COLOR_NORMAL); - end else begin - $display("%sSUCCESS%s: all tests passed", COLOR_GREEN, COLOR_NORMAL); - end -endtask + task bh_info(string description); + if (bh_assert_log_level >= BH_ASSERT_LOG_LEVEL_INFO) begin + $display("%t: INFO: %s", $time, description); + end + endtask -task bh_info(string description); - if (bh_assert_log_level >= BH_ASSERT_LOG_LEVEL_INFO) begin - $display("%t: INFO: %s", $time, description); - end -endtask + task bh_warn(string description); + if (bh_assert_log_level >= BH_ASSERT_LOG_LEVEL_WARN) begin + $display("%t: %sWARN%s: %s", $time, COLOR_YELLOW, COLOR_NORMAL, description); + end + bh_assert_warn_count = bh_assert_warn_count + 1; + endtask -task bh_warn(string description); - if (bh_assert_log_level >= BH_ASSERT_LOG_LEVEL_WARN) begin - $display("%t: %sWARN%s: %s", $time, COLOR_YELLOW, COLOR_NORMAL, description); - end - bh_assert_warn_count = bh_assert_warn_count + 1; -endtask - - -endpackage \ No newline at end of file +endpackage diff --git a/lib/skidbuffer.sv b/lib/skidbuffer.sv index 93c513b..60f35d6 100644 --- a/lib/skidbuffer.sv +++ b/lib/skidbuffer.sv @@ -12,43 +12,42 @@ module skidbuffer #( output logic out_valid, input logic out_ready ); + logic buffer_filled = 0; + logic [WIDTH-1:0] buffer_val; -logic buffer_filled = 0; -logic [WIDTH-1:0] buffer_val; - -always_ff @(posedge clk) begin - if (reset) begin - buffer_filled <= 0; - end else begin - if (in_valid && in_ready) begin - // input always gets stored whether it needs to be or not - buffer_val <= in; - end - - if (buffer_filled) begin - if ((out_valid && out_ready) && !(in_valid && in_ready)) begin - // out_valid = 1 since buffer is full - buffer_filled <= 0; - end + always_ff @(posedge clk) begin + if (reset) begin + buffer_filled <= 0; end else begin - if ((in_valid && in_ready) && !(out_valid && out_ready)) begin - // in_ready = 1 since buffer is empty - buffer_filled <= 1; + if (in_valid && in_ready) begin + // input always gets stored whether it needs to be or not + buffer_val <= in; + end + + if (buffer_filled) begin + if ((out_valid && out_ready) && !(in_valid && in_ready)) begin + // out_valid = 1 since buffer is full + buffer_filled <= 0; + end + end else begin + if ((in_valid && in_ready) && !(out_valid && out_ready)) begin + // in_ready = 1 since buffer is empty + buffer_filled <= 1; + end end end end -end -always_comb begin - if (buffer_filled) begin - in_ready = out_ready; - out_valid = 1; - out = buffer_val; - end else begin - in_ready = 1; - out_valid = in_valid; - out = in; + always_comb begin + if (buffer_filled) begin + in_ready = out_ready; + out_valid = 1; + out = buffer_val; + end else begin + in_ready = 1; + out_valid = in_valid; + out = in; + end end -end endmodule \ No newline at end of file diff --git a/lib/tb/skidbuffer_tb.sv b/lib/tb/skidbuffer_tb.sv index 2865877..a91bb91 100644 --- a/lib/tb/skidbuffer_tb.sv +++ b/lib/tb/skidbuffer_tb.sv @@ -5,79 +5,77 @@ import bh_assert::bh_assert_equal; import bh_assert::bh_assert_stats; module skidbuffer_tb(); + parameter WIDTH = 15; + parameter TEST_LIST_LENGTH = 256; -parameter WIDTH = 15; -parameter TEST_LIST_LENGTH = 256; + logic clk = 0; + logic reset = 1; + logic [WIDTH-1:0] in; + logic in_valid = 0; + wire in_ready; + wire [WIDTH-1:0] out; + wire out_valid; + logic out_ready = 0; -logic clk = 0; -logic reset = 1; -logic [WIDTH-1:0] in; -logic in_valid = 0; -wire in_ready; -wire [WIDTH-1:0] out; -wire out_valid; -logic out_ready = 0; + skidbuffer #( + .WIDTH(WIDTH) + ) dut ( + .clk(clk), + .reset(reset), + .in(in), + .in_valid(in_valid), + .in_ready(in_ready), + .out(out), + .out_valid(out_valid), + .out_ready(out_ready) + ); -skidbuffer #( - .WIDTH(WIDTH) -) dut ( - .clk(clk), - .reset(reset), - .in(in), - .in_valid(in_valid), - .in_ready(in_ready), - .out(out), - .out_valid(out_valid), - .out_ready(out_ready) -); + integer i = 0; + integer in_count = 0; + integer out_count = 0; + logic [WIDTH-1:0] in_list [0:TEST_LIST_LENGTH-1]; -integer i = 0; -integer in_count = 0; -integer out_count = 0; -logic [WIDTH-1:0] in_list [0:TEST_LIST_LENGTH-1]; + assign in = in_list[in_count]; -assign in = in_list[in_count]; + always #5 clk = !clk; -always #5 clk = !clk; + initial begin + $dumpfile("skidbuffer_tb.vcd"); + $dumpvars(0, skidbuffer_tb); -initial begin - $dumpfile("skidbuffer_tb.vcd"); - $dumpvars(0, skidbuffer_tb); + for (i=0; i