I want you to find here a simple example of something you didn't know how to do. paypal.me/AsicStoic
An occasional sharing of knowledge, review and commentary on ASIC Mix signal design by a pseudonymous ASIC design engineer
Total Pageviews
Labels
- ALGORITHAMS USED IN ASIC IMPLEMENTATION (2)
- ANALOG DESIGN BASICS (17)
- ASIC MIX SIGNAL SPECIFICATION FOR AUTOMATIVE APPLICATIONS (1)
- ASIC/FPGA DIGITAL DESIGN VERIFICATION (7)
- GENERAL POINTS OF VERILOG AMS (4)
- GENERIC ASIC MIX SIGNAL SPECIFICATION (4)
- HOW TO IMPLEMENT A GENERIC ASIC MIX SIGNAL (2)
- HOW TO IMPLEMENT AN ASIC MIX SIGNAL FOR AN AUTOMOTIVE APPLICATION (1)
- IMPLEMENTATIONS (4)
- SPECIFICATIONS (8)
- SYSTEM VERILOG (3)
- SYSTEM VERILOG v.s. VERILOG HDL: WHAT IS DIFFERENT AND WHAT ARE SYSTEM VERILOG ADVANTAGES (IF ANY)? (2)
- SYSTEMVERILOG ASSERTATIONS (1)
- VERILOG AMS (4)
I want you to find here a simple example of something you didn't know how to do. paypal.me/AsicStoic
Showing posts with label SYSTEM VERILOG v.s. VERILOG HDL: WHAT IS DIFFERENT AND WHAT ARE SYSTEM VERILOG ADVANTAGES (IF ANY)?. Show all posts
Showing posts with label SYSTEM VERILOG v.s. VERILOG HDL: WHAT IS DIFFERENT AND WHAT ARE SYSTEM VERILOG ADVANTAGES (IF ANY)?. Show all posts
Friday, October 14, 2011
Simple testbench done in System Verilog with OVM
The testbench described here (done in OVM) has the same functionality or behavior as a testbenches done without OVM, described in the blog post : Simple testbench (done in both System Verilog and Verilog HDL) for a Digital design block (Verilog HDL) verification
Simple testbench (done in both System Verilog and Verilog HDL) for a Digital design block (Verilog HDL) verification
Lets assume that we have to verify a basic memory design block done in behavior Verilog HDL (memory.v ) .
memory.v is done here in Verilog HDL and NOT in System Verilog for legacy reasons:
/////////////////
/// DUT
///////////////
module memory(
address,
data_in,
data_out,
read_write,
chip_en
);
input [7:0] address, data_in;
output[7:0] data_out;
input read_write, chip_en;
reg [7:0] data_out ;
reg [7:0] mem [0:255];
always @ (address or data_in or read_write or chip_en)
if (read_write == 1 && chip_en == 1) begin
mem[address] = data_in;
end
always @ (read_write or chip_en or address)
if (read_write == 0 && chip_en)
data_out = mem[address];
else
data_out = 0;
endmodule
Here is a simple testbench enviroment first done in Verilog HDL and in System Verilog.
// Testbench
////////////////////////////
module Testbench(
address,
data_in,
data_out,
read_write,
chip_en
);
output [7:0] address, data_in;
input [7:0] data_out;
output read_write, chip_en;
reg [7:0] address, data_in;
reg read_write, chip_en;
initial
begin
address = 0 ;
data_in = 0 ;
read_write = 0 ;
chip_en = 0 ;
repeat(3)
begin
#100
chip_en = 1 ;
address = $random ;
data_in = $random ;
read_write = 1’b1 ;
#100
read_write = 1’b0 ;
end
#100
chip_en = 0 ;
#100
$finish;
end // initial
endmodule
///////////////////////////////////////////////////////////////////////////////
// top module: integrating Dut and it’s Testbench
///////////////////////////////////////////////////////////////////////////////
module top();
wire [7:0] address, data_in;
wire [7:0] data_out;
wire read_write, chip_en;
memory D (
.address ( address ),
.data_in ( data_in ),
.data_out ( data_out ),
.read_write ( read_write ),
.chip_en ( chip_en )
);
Testbench tb (
.address ( address ),
.data_in ( data_in ),
.data_out ( data_out ),
.read_write ( read_write ),
.chip_en ( chip_en )
);
endmodule
////////////////////////////////////////////////////////////////////////////////////////////////
// Interface: for communication between Dut and it’s Testbench
////////////////////////////////////////////////////////////////////////////////////////////////
`ifndef GUARD_INTERFACE
`define GUARD_INTERFACE
interface intf ();
`endif
///////////////////////////
// Testbench
////////////////////////////
module Testbench(intf tb_if);
///////////////////////////////////////////////////////////////////////////////
// top module ( top.sv ): integrating Dut and it’s Testbench
////////////////////////////////////////////////////////////////////////////
`ifndef GUARD_TOP
`define GUARD_TOP
module top();
`endif
memory.v is done here in Verilog HDL and NOT in System Verilog for legacy reasons:
- it is certain that we can synthesise Verilog HDL RTL design and gate level design that is result of synthesis will also be in Verilog HDL.
/////////////////
/// DUT
///////////////
module memory(
address,
data_in,
data_out,
read_write,
chip_en
);
input [7:0] address, data_in;
output[7:0] data_out;
input read_write, chip_en;
reg [7:0] data_out ;
reg [7:0] mem [0:255];
always @ (address or data_in or read_write or chip_en)
if (read_write == 1 && chip_en == 1) begin
mem[address] = data_in;
end
always @ (read_write or chip_en or address)
if (read_write == 0 && chip_en)
data_out = mem[address];
else
data_out = 0;
endmodule
Here is a simple testbench enviroment first done in Verilog HDL and in System Verilog.
Testbench enviroment done in Verilog HDL
////////////////////////////// Testbench
////////////////////////////
module Testbench(
address,
data_in,
data_out,
read_write,
chip_en
);
output [7:0] address, data_in;
input [7:0] data_out;
output read_write, chip_en;
reg [7:0] address, data_in;
reg read_write, chip_en;
initial
begin
address = 0 ;
data_in = 0 ;
read_write = 0 ;
chip_en = 0 ;
repeat(3)
begin
#100
chip_en = 1 ;
address = $random ;
data_in = $random ;
read_write = 1’b1 ;
#100
read_write = 1’b0 ;
end
#100
chip_en = 0 ;
#100
$finish;
end // initial
endmodule
///////////////////////////////////////////////////////////////////////////////
// top module: integrating Dut and it’s Testbench
///////////////////////////////////////////////////////////////////////////////
module top();
wire [7:0] address, data_in;
wire [7:0] data_out;
wire read_write, chip_en;
memory D (
.address ( address ),
.data_in ( data_in ),
.data_out ( data_out ),
.read_write ( read_write ),
.chip_en ( chip_en )
);
Testbench tb (
.address ( address ),
.data_in ( data_in ),
.data_out ( data_out ),
.read_write ( read_write ),
.chip_en ( chip_en )
);
endmodule
Testbench enviroment done in System Verilog
Simulate with Cadence tools with the command:
irun -access +r -gui top.sv////////////////////////////////////////////////////////////////////////////////////////////////
// Interface: for communication between Dut and it’s Testbench
////////////////////////////////////////////////////////////////////////////////////////////////
`ifndef GUARD_INTERFACE
`define GUARD_INTERFACE
interface intf ();
logic read_write, chip_en ;
logic[7:0] address, data_in ;
logic[7:0] data_out ;
modport tb (output read_write, chip_en, address, data_in, input data_out);
endinterface :intf`endif
///////////////////////////
// Testbench
////////////////////////////
module Testbench(intf tb_if);
initial
begin
tb_if.address = 0 ;
tb_if.data_in = 0 ;
tb_if.read_write = 0 ;
tb_if.chip_en = 0 ;
repeat(3) begin
#100
tb_if.chip_en = 1 ;
tb_if.address = $random ;
tb_if.data_in = $random ;
tb_if.read_write = 1 ;
#100
tb_if.read_write = 0 ;
end
#100
tb_if.chip_en = 0 ;
#1000
$finish;
end
endmodule///////////////////////////////////////////////////////////////////////////////
// top module ( top.sv ): integrating Dut and it’s Testbench
////////////////////////////////////////////////////////////////////////////
`ifndef GUARD_TOP
`define GUARD_TOP
module top();
intf bus_if(); //interface instantiation
Testbench tb (
.tb_if( bus_if )
) ; // Pass the modport into the module
memory d (
.address ( bus_if.address ), // connect the verilog
.data_in ( bus_if.data_in ), // RTL port using interface hierarchy signal name.
.data_out ( bus_if.data_out ),
.read_write ( bus_if.read_write ),
.chip_en ( bus_if.chip_en )
);
endmodule : top`endif
Subscribe to:
Posts (Atom)