| module decode1_1(input clk, |
| input rst, |
| input [31:0] in_count, |
| input in_valid, |
| output in_ready, |
| |
| input out_ready, |
| output out_valid); |
| |
| reg [31:0] r_remaining_count; |
| reg r_valid; |
| reg r_ready; |
| |
| assign out_valid = r_valid; |
| assign in_ready = r_ready; |
| |
| always @(posedge clk) begin |
| if (rst) begin |
| r_remaining_count <= 0; |
| r_valid <= 0; |
| r_ready <= 0; |
| end else begin |
| if (r_remaining_count == 0) begin |
| if (r_ready && in_valid) begin |
| r_remaining_count <= in_count; |
| r_valid <= in_count != 0; |
| r_ready <= 0; |
| end else begin |
| r_ready <= 1; |
| r_valid <= 0; |
| end |
| end else begin |
| r_valid <= !(r_remaining_count == 1 && out_ready && out_valid); |
| r_ready <= 0; |
| |
| if (out_valid && out_ready) begin |
| r_remaining_count <= r_remaining_count - 1; |
| end |
| end |
| end |
| end |
| |
| endmodule // decode1_1 |
| |
| module top(input clk); |
| wire out_valid; |
| wire [31:0] out_data; |
| wire out_ready = 1'b1; |
| |
| reg [31:0] cycles; |
| wire rst = (cycles < 3); |
| |
| wire in_ready; |
| |
| reg [31:0] test_counts [0:1]; |
| reg [31:0] test_index; |
| wire in_valid = (test_index < 1) && (cycles > 2); |
| |
| reg [9:0] out_data_index; |
| |
| always @(posedge clk) |
| begin |
| cycles <= cycles + 1; |
| end |
| |
| always @(posedge clk) |
| begin |
| if (cycles < 1) begin |
| test_counts[cycles] <= $anyseq; |
| end |
| end |
| |
| initial begin |
| cycles = 0; |
| |
| test_index = 0; |
| end |
| |
| decode1_1 decoder(clk, rst, |
| test_counts[test_index], |
| in_valid, |
| in_ready, |
| |
| out_ready, |
| out_valid); |
| |
| always @(posedge clk) begin |
| if (!rst) begin |
| assert(out_data_index <= 0); |
| |
| if (in_valid && in_ready) begin |
| test_index <= test_index + 1; |
| end |
| if (out_ready && out_valid) begin |
| out_data_index <= out_data_index + 1; |
| end |
| end |
| end // always @ (posedge clk) |
| endmodule |