blob: 79482661295548ab24c95d8ff99908ad3f870627 [file] [log] [blame]
import uvm_pkg::* ;
`include "uvm_macros.svh"
interface mem_if2 (input clk);
wire clk;
logic reset;
modport system (input clk, reset);
modport tb (input clk, output reset, toto);
generate
for(genvar i = 0; i < 2; i++) begin : mod_gen
modport tb (clocking cb, input clk);
end
endgenerate
endinterface
module toto (a, output b, c);
wire a,b,c;
endmodule
module toto1 (ab, f, output b, c);
wire a,b,c;
endmodule
//+++++++++++++++++++++++++++++++++++++++++++++++++
// Define the interface
//+++++++++++++++++++++++++++++++++++++++++++++++++
interface mem_if (input wire clk);
wire reset;
wire we;
wire ce;
wire [7:0] datai;
logic [7:0] datao;
wire [7:0] addr;
//=================================================
// Clocking block for testbench
//=================================================
clocking cb @ (posedge clk);
output reset, we, ce, datai,addr;
input datao;
endclocking
//=================================================
// Modport for testbench
//=================================================
modport tb (clocking cb, input clk);
endinterface
//+++++++++++++++++++++++++++++++++++++++++++++++++
// DUT With interface
//+++++++++++++++++++++++++++++++++++++++++++++++++
module simple_if (mem_if mif);
// Memory array
logic [7:0] mem [0:255];
//=================================================
// Read logic
//=================================================
always @ (posedge mif.clk)
if (mif.reset) mif.datao <= 0;
else if (mif.ce && !mif.we) mif.datao <= mem[mif.addr];
//=================================================
// Write Logic
//=================================================
always @ (posedge mif.clk)
if (mif.ce && mif.we) mem[mif.addr] <= mif.datai;
endmodule
//+++++++++++++++++++++++++++++++++++++++++++++++++
// Testbench
//+++++++++++++++++++++++++++++++++++++++++++++++++
module tb();
logic clk = 0;
always #10 clk++;
//=================================================
// Instianciate Interface and DUT
//=================================================
mem_if miff(clk);
simple_if U_dut(miff);
//=================================================
// Default clocking
//=================================================
default clocking dclk @ (posedge clk);
endclocking
//=================================================
// Test Vector generation
//=================================================
initial begin
miff.tb.cb.reset <= 1;
miff.tb.cb.ce <= 1'b0;
miff.tb.cb.we <= 1'b0;
miff.tb.cb.addr <= 0;
miff.tb.cb.datai <= 0;
##1 miff.tb.cb.reset <= 0;
for (int i = 0; i < 3; i ++ ) begin
##1 miff.tb.cb.ce <= 1'b1;
miff.tb.cb.we <= 1'b1;
miff.tb.cb.addr <= i;
miff.tb.cb.datai <= $random;
##3 miff.tb.cb.ce <= 1'b0;
$display ("@%0dns Write access address %x, data %x",
$time,miff.addr,miff.datai);
end
for (int i = 0; i < 3; i ++ ) begin
##1 miff.tb.cb.ce <= 1'b1;
miff.tb.cb.we <= 1'b0;
miff.tb.cb.addr <= i;
##3 miff.tb.cb.ce <= 1'b0;
$display ("@%0dns Read access address %x, data %x",
$time,miff.addr,miff.datao);
end
#10 $finish;
end
endmodule