FIFO
FIFO
Design Code
begin
if (rst == 1'b1)
begin
// Reset the pointers and counter when the reset signal is asserted
wptr <= 0;
rptr <= 0;
cnt <= 0;
end
end
begin
end
end
endmodule
//////////////////////////////////////
interface fifo_if;
logic clock, rd, wr; // Clock, read, and write signals
endinterface
class transaction;
constraint oper_ctrl {
oper dist {1 :/ 50 , 0 :/ 50}; // Constraint to randomize 'oper' with 50% probability of 1 and
50% probability of 0
endclass
///////////////////////////////////////////////////
class generator;
this.mbx = mbx;
tr = new();
endfunction;
task run();
i++;
mbx.put(tr);
@(next);
endclass
////////////////////////////////////////////
class driver;
this.mbx = mbx;
endfunction;
task reset();
fif.data_in <= 0;
$display("------------------------------------------");
endtask
task write();
@(posedge fif.clock);
@(posedge fif.clock);
@(posedge fif.clock);
endtask
task read();
@(posedge fif.clock);
@(posedge fif.clock);
@(posedge fif.clock);
endtask
task run();
forever begin
mbx.get(datac);
if (datac.oper == 1'b1)
write();
else
read();
end
endtask
endclass
///////////////////////////////////////////////////////
class monitor;
this.mbx = mbx;
endfunction;
task run();
tr = new();
forever begin
tr.wr = fif.wr;
tr.rd = fif.rd;
tr.data_in = fif.data_in;
tr.full = fif.full;
tr.empty = fif.empty;
@(posedge fif.clock);
tr.data_out = fif.data_out;
mbx.put(tr);
end
endtask
endclass
/////////////////////////////////////////////////////
class scoreboard;
event next;
this.mbx = mbx;
endfunction;
task run();
forever begin
mbx.get(tr);
din.push_front(tr.data_in);
end
else begin
$display("--------------------------------------");
end
temp = din.pop_back();
if (tr.data_out == temp)
else begin
err++;
end
end
else begin
end
$display("--------------------------------------");
end
-> next;
end
endtask
endclass
///////////////////////////////////////////////////////
class environment;
generator gen;
driver drv;
monitor mon;
scoreboard sco;
event nextgs;
gdmbx = new();
gen = new(gdmbx);
drv = new(gdmbx);
msmbx = new();
mon = new(msmbx);
sco = new(msmbx);
this.fif = fif;
drv.fif = this.fif;
mon.fif = this.fif;
gen.next = nextgs;
sco.next = nextgs;
endfunction
task pre_test();
drv.reset();
endtask
task test();
fork
gen.run();
drv.run();
mon.run();
sco.run();
join_any
endtask
task post_test();
wait(gen.done.triggered);
$display("---------------------------------------------");
$display("---------------------------------------------");
$finish();
endtask
task run();
pre_test();
test();
post_test();
endtask
endclass
///////////////////////////////////////////////////////
module tb;
fifo_if fif();
FIFO dut (fif.clock, fif.rst, fif.wr, fif.rd, fif.data_in, fif.data_out, fif.empty, fif.full);
initial begin
fif.clock <= 0;
end
environment env;
initial begin
env = new(fif);
env.gen.count = 10;
env.run();
end
initial begin
$dumpfile("dump.vcd");
$dumpvars;
end
endmodule
SPI PROTOCOL
Design Code
module spi_master(
);
typedef enum bit [1:0] {idle = 2'b00, enable = 2'b01, send = 2'b10, comp = 2'b11 } state_type;
int count = 0;
/////////////////////////generation of sclk
always@(posedge clk)
begin
countc <= 0;
end
else begin
if(countc < 10 )
else
begin
countc <= 0;
end
end
end
//////////////////state machine
begin
cs <= 1'b1;
end
else begin
case(state)
idle:
begin
cs <= 1'b0;
end
else begin
end
end
send : begin
end
else
begin
count <= 0;
cs <= 1'b1;
end
end
endcase
end
end
endmodule
///////////////////////////
module spi_slave (
int count = 0;
always@(posedge sclk)
begin
case(state)
detect_start:
begin
if(cs == 1'b0)
else
end
read_data : begin
begin
end
else
begin
count <= 0;
end
end
endcase
end
endmodule
///////////////////////////////
module top (
output done
);
endmodule
Verilog TB
//////////////////////////////////////////////////////////////////////////////////
module tb( );
wire done;
rst = 1;
rst = 0;
begin
newd = 1;
din = $urandom;
@(posedge dut.s1.sclk);
newd = 0;
@(posedge done);
end
end
endmodule
Testbench Code
////////////////Transaction Class
class transaction;
endfunction
endclass
////////////////Generator Class
class generator;
task run();
repeat(count) begin
end
endtask
endclass
////////////////Driver Class
class driver;
this.mbxds = mbxds;
endfunction
task reset();
$display("-----------------------------------------");
endtask
task run();
forever begin
@(posedge vif.sclk);
@(posedge vif.sclk);
end
endtask
endclass
////////////////Monitor Class
class monitor;
endfunction
task run();
forever begin
@(posedge vif.sclk);
@(posedge vif.done);
tr.dout = vif.dout; // Record data output
@(posedge vif.sclk);
end
endtask
endclass
////////////////Scoreboard Class
class scoreboard;
mailbox #(bit [11:0]) mbxds, mbxms; // Mailboxes for data from driver and monitor
this.mbxms = mbxms;
endfunction
task run();
forever begin
if(ds == ms)
else
$display("-----------------------------------------");
end
endtask
endclass
////////////////Environment Class
class environment;
mbxms = new();
mbxds = new();
this.vif = vif;
drv.vif = this.vif;
mon.vif = this.vif;
sco.sconext = nextgs;
gen.drvnext = nextgd;
drv.drvnext = nextgd;
endfunction
task pre_test();
endtask
task test();
fork
join_any
endtask
task post_test();
$finish();
endtask
task run();
pre_test();
test();
post_test();
endtask
endclass
////////////////Testbench Top
module tb;
top dut(vif.clk,vif.rst,vif.newd,vif.din,vif.dout,vif.done);
initial begin
vif.clk <= 0;
end
environment env;
initial begin
env = new(vif);
env.gen.count = 4;
env.run();
end
initial begin
$dumpfile("dump.vcd");
$dumpvars;
end
endmodule