mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-09-10 03:54:26 +00:00
100 lines
2.4 KiB
Coq
100 lines
2.4 KiB
Coq
|
// DESCRIPTION: Verilator: Verilog Test module
|
||
|
//
|
||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||
|
// without warranty, 2005 by Wilson Snyder.
|
||
|
|
||
|
module t (/*AUTOARG*/
|
||
|
// Inputs
|
||
|
clk
|
||
|
);
|
||
|
input clk;
|
||
|
integer cyc; initial cyc=1;
|
||
|
|
||
|
// verilator lint_off UNOPT
|
||
|
// verilator lint_off UNOPTFLAT
|
||
|
// verilator lint_off MULTIDRIVEN
|
||
|
// verilator lint_off BLKANDNBLK
|
||
|
|
||
|
reg [31:0] comcnt;
|
||
|
reg [31:0] dlycnt; initial dlycnt=0;
|
||
|
reg [31:0] lastdlycnt; initial lastdlycnt = 0;
|
||
|
|
||
|
reg [31:0] comrun; initial comrun = 0;
|
||
|
reg [31:0] comrunm1;
|
||
|
reg [31:0] dlyrun; initial dlyrun = 0;
|
||
|
reg [31:0] dlyrunm1;
|
||
|
always @ (posedge clk) begin
|
||
|
$write("[%0t] cyc %d\n",$time,cyc);
|
||
|
cyc <= cyc + 1;
|
||
|
if (cyc==2) begin
|
||
|
// Test # of iters
|
||
|
lastdlycnt = 0;
|
||
|
comcnt = 0;
|
||
|
dlycnt <= 0;
|
||
|
end
|
||
|
if (cyc==3) begin
|
||
|
dlyrun <= 5;
|
||
|
dlycnt <= 0;
|
||
|
end
|
||
|
if (cyc==4) begin
|
||
|
comrun = 4;
|
||
|
end
|
||
|
end
|
||
|
always @ (negedge clk) begin
|
||
|
if (cyc==5) begin
|
||
|
$display("%d %d\n", dlycnt, comcnt);
|
||
|
if (dlycnt != 32'd5) $stop;
|
||
|
if (comcnt != 32'd19) $stop;
|
||
|
$write("*-* All Finished *-*\n");
|
||
|
$finish;
|
||
|
end
|
||
|
end
|
||
|
|
||
|
// This forms a "loop" where we keep going through the always till comrun=0
|
||
|
reg runclk; initial runclk = 1'b0;
|
||
|
always @ (/*AS*/comrunm1 or dlycnt) begin
|
||
|
if (lastdlycnt != dlycnt) begin
|
||
|
comrun = 3;
|
||
|
$write ("[%0t] comrun=%0d start\n", $time, comrun);
|
||
|
end
|
||
|
else if (comrun > 0) begin
|
||
|
comrun = comrunm1;
|
||
|
if (comrunm1==1) begin
|
||
|
runclk = 1;
|
||
|
$write ("[%0t] comrun=%0d [trigger clk]\n", $time, comrun);
|
||
|
end
|
||
|
else $write ("[%0t] comrun=%0d\n", $time, comrun);
|
||
|
end
|
||
|
lastdlycnt = dlycnt;
|
||
|
end
|
||
|
|
||
|
always @ (/*AS*/comrun) begin
|
||
|
if (comrun!=0) begin
|
||
|
comrunm1 = comrun - 32'd1;
|
||
|
comcnt = comcnt + 32'd1;
|
||
|
$write("[%0t] comcnt=%0d\n",$time,comcnt);
|
||
|
end
|
||
|
end
|
||
|
|
||
|
// This forms a "loop" where we keep going through the always till dlyrun=0
|
||
|
reg runclkrst;
|
||
|
always @ (posedge runclk) begin
|
||
|
runclkrst <= 1;
|
||
|
$write ("[%0t] runclk\n", $time);
|
||
|
if (dlyrun > 0) begin
|
||
|
dlyrun <= dlyrun - 32'd1;
|
||
|
dlycnt <= dlycnt + 32'd1;
|
||
|
$write ("[%0t] dlyrun<=%0d\n", $time, dlyrun-32'd1);
|
||
|
end
|
||
|
end
|
||
|
|
||
|
always @* begin
|
||
|
if (runclkrst) begin
|
||
|
$write ("[%0t] runclk reset\n", $time);
|
||
|
runclkrst = 0;
|
||
|
runclk = 0;
|
||
|
end
|
||
|
end
|
||
|
|
||
|
endmodule
|