| // DESCRIPTION: Verilator: Check initialisation of cloned clock variables |
| // |
| // This tests issue 1327 (Strange initialisation behaviour with |
| // "VinpClk" cloned clock variables) |
| // |
| // This file ONLY is placed into the Public Domain, for any use, |
| // without warranty, 2018 by Rupert Swarbrick (Argon Design). |
| |
| |
| // bug1327 |
| // This models some device under test with an asynchronous reset pin |
| // which counts to 15. |
| module dut (input wire clk, |
| input wire rst_n, |
| output wire done); |
| |
| reg [3:0] counter; |
| |
| always @(posedge clk or negedge rst_n) begin |
| if (rst_n & ! clk) begin |
| $display("[%0t] %%Error: Oh dear! 'always @(posedge clk or negedge rst_n)' block triggered with clk=%0d, rst_n=%0d.", |
| $time, clk, rst_n); |
| $stop; |
| end |
| |
| if (! rst_n) begin |
| counter <= 4'd0; |
| end else begin |
| counter <= counter < 4'd15 ? counter + 4'd1 : counter; |
| end |
| end |
| |
| assign done = rst_n & (counter == 4'd15); |
| endmodule |
| |
| |
| module t(input wire clk, |
| input wire rst_n); |
| |
| wire dut_done; |
| |
| // A small FSM for driving the test |
| // |
| // This is just designed to be enough to force Verilator to make a |
| // "VinpClk" variant of dut_rst_n. |
| |
| // Possible states: |
| // |
| // 0: Device in reset |
| // 1: Device running |
| // 2: Device finished |
| reg [1:0] state; |
| always @(posedge clk or negedge rst_n) begin |
| if (! rst_n) begin |
| state <= 0; |
| end else begin |
| if (state == 2'd0) begin |
| // One clock after resetting the device, we switch to running |
| // it. |
| state <= 2'd1; |
| end |
| else if (state == 2'd1) begin |
| // If the device is running, we switch to finished when its |
| // done signal goes high. |
| state <= dut_done ? 2'd2 : 2'd1; |
| end |
| else begin |
| // If the dut has finished, the test is done. |
| $write("*-* All Finished *-*\n"); |
| $finish; |
| end |
| end |
| end |
| |
| wire dut_rst_n = rst_n & (state != 0); |
| |
| wire done; |
| dut dut_i (.clk (clk), |
| .rst_n (dut_rst_n), |
| .done (dut_done)); |
| |
| endmodule |