module dreg_tb (); parameter BITS = 4; parameter CLKP = 10; reg dclk; // clock net always begin #(CLKP/2) dclk = ~dclk; end reg dwen; reg[BITS-1:0] ddat; task dreg_write ; input integer dval; begin ddat = dval; // setup data for write dwen = 1'b1; // enable write for 1 clk period $display("-- [%05g] WR-dreg:'%b' ",$time,ddat); #(CLKP/2); // setup time #(CLKP/2); // hold time dwen = 1'b0; // disable write end endtask always @(dut.tdat) begin $write("## [%05g] dregQ=%b\n",$time,dut.tdat); end reg dren; wire[BITS-1:0] mdat; task dreg_read ; begin dren = 1'b1; // enable read for 1 clk period #(CLKP/2); // setup time $display("@@ [%05g] RD-dreg:'%b' ",$time,mdat); #(CLKP/2); // hold time dren = 1'b0; // disable read end endtask initial begin dclk = 1'b1; //ddat = 4'h5; dwen = 1'b0; dren = 1'b0; // start test dreg_read(); #(CLKP/2); // wait for -ve edge dreg_write(4'b1010); #CLKP; dreg_read(); dreg_write(12); #CLKP; dreg_read(); $stop; end defparam dut.BITS = BITS; dreg dut (dclk,dwen,dren,ddat,mdat); endmodule