// See LICENSE.SiFive for license details. /** This black-boxes an Async Reset * Reg. * * Because Chisel doesn't support * parameterized black boxes, * we unfortunately have to * instantiate a number of these. * * We also have to hard-code the set/reset. * * Do not confuse an asynchronous * reset signal with an asynchronously * reset reg. You should still * properly synchronize your reset * deassertion. * * @param d Data input * @param q Data Output * @param clk Clock Input * @param rst Reset Input * @param en Write Enable Input * */ `ifdef RANDOMIZE_GARBAGE_ASSIGN `define RANDOMIZE `endif `ifdef RANDOMIZE_INVALID_ASSIGN `define RANDOMIZE `endif `ifdef RANDOMIZE_REG_INIT `define RANDOMIZE `endif `ifdef RANDOMIZE_MEM_INIT `define RANDOMIZE `endif module AsyncResetReg (d, q, en, clk, rst); parameter RESET_VALUE = 0; input wire d; output reg q; input wire en; input wire clk; input wire rst; // There is a lot of initialization // here you don't normally find in Verilog // async registers because of scenarios in which reset // is not actually asserted cleanly at time 0, // and we want to make sure to properly model // that, yet Chisel codebase is absolutely intolerant // of Xs. `ifndef SYNTHESIS initial begin `ifdef RANDOMIZE integer initvar; reg [31:0] _RAND; _RAND = {1{$random}}; q = _RAND[0]; `endif // RANDOMIZE if (rst) begin q = RESET_VALUE; end end `endif always @(posedge clk or posedge rst) begin if (rst) begin q <= RESET_VALUE; end else if (en) begin q <= d; end end endmodule // AsyncResetReg