Q T F SVA: Uick Utorial OR
Q T F SVA: Uick Utorial OR
Q T F SVA: Uick Utorial OR
SVA
In this appendix, we provide a quick tutorial for
SystemVerilog Assertions (SVA). It is not our objective to
present a comprehensive overview of SVA. Our goal is to
provide you with enough information so that you can
understand the examples presented in this book. For a
complete overview and reference of the SVA language, we
recommend the following sources: [Cohen 2005], [Haque et
al., 2006], and [Vijayaraghavan and Ramanathan 2005].
Using SVA, we are able to specify the design intent (that is,
expected behavior) in terms of properties. Once defined, we
can check our properties as assertions or use them as
verification constraints (assumptions), or they can describe
module my_arb (. . . )
always @* begin // arbiter code
. . .
if (grant[0] & grant[1]))
$display (“Mutex violation for grant[0] and grant[1]”);
. . .
end
endmodule
module my_arb (. . . )
always @* begin // arbiter code
. . .
assert (!(grant[0] & grant[1]));
. . .
end
endmodule
module my_arb (. . . )
always @* begin // arbiter code
. . .
end
assert property (@(posedge clk) !(grant[0] & grant[1]));
endmodule
A.1.3 Resets
SystemVerilog provides a mechanism to asynchronously
disable an assertion during a reset using the SVA disable
iff clause. In Example A-4, we demonstrate the same
assertion expressed in Example A-3, except we have added
a reset signal. Even though our concurrent assertion is
clocked (@(posedge clk)) the assertion is asynchronously
disabled when the disable iff clause expression evaluates
true.
module my_arb (. . . )
always @* begin // arbiter code
. . .
end
assert property (@(posedge clk) disable iff (reset)
!(grant[0] & grant[1]));
endmodule
concurrent_assertion_statement ::=
assert property ( property_spec ) action_block
property_spec ::=
[ clocking_event ] [ disable iff ( expression_or_dist ) ]
property_expr
action_block ::=
pass_statement_or_null
| [ pass_statement ] else fail_statement
assert property
( @(posedge clk) disable iff (reset) !(grant[0] & grant[1]) )
else begin // action block fail statement
// See Appendix B, “Complete OVM/AVM Testbench Example” for OVM
details
status = new();
status.set_err_grant_mutex();
status_ap.write(status);
end
Figure A-1. Trace on which the sequence (start ##1 transfer) holds
v
| | | |
start
transfer
Figure A-2. Trace on which the sequence (start ##2 transfer) holds
v
| | | |
start
transfer
| | | |
start
transfer
a[=2] ##1 b
• a module
• an interface
• a program
• a clocking block
• a package
• a compilation-unit scope
Sequences can be declared with or without parameters, as
demonstrated in Example A-10.
sequence op_retry;
(req ##1 retry);
endsequence
property req_t1_start;
@(posedge clk) req && req_tag == t1;
endproperty
property illegal_op;
@(posedge clk) ~(req && cmd == 4);
endproperty
A.4.1 AND
Both SVA properties and sequences can be operands of the
and operator. The operation on two sequences produces a
match when both sequences produce a match (the end point
may not match). A match occurs until the endpoint of the
longer sequence (provided the shorter sequence produces
one match).
A.4.3 OR
SVA provides a means to or sequences. For or-ed
sequences, a match on either sequence results in a match for
the operation
sequence a1;
@(posedge clk) (c ##1 b ##1 d);
endsequence
$sampled(expression [, clocking_event])
• $countones ( expression)
$asserton(levels, [ list_of_modules_or_assertions])
$assertkill(levels, [ list_of_modules_or_assertions])
$assertoff(levels, [ list_of_modules_or_assertions])
sequence track_it;
(req[->1], $display(“Found the request at cycle %0d\n”,
‘cycle))
##1 (sent[->1], $display(“Sent occurred at cycle %0d\n”,
‘cycle))
##3 done;
endsequence
assert property (start |=> track_it);
immediate_assert_statement ::=
assert ( expression ) action_block
concurrent_assert_statement ::=
assert property ‘(‘ property_spec ‘)’ action_block
concurrent_assume_statement ::=
assume property ‘(‘ property_spec ‘)’ ‘;’
concurrent_cover_statement ::=
cover property ‘(‘ property_spec ‘)’ statement_or_null
action_block ::=
statement [ else statement_or_null ]
| [statement_or_null] else statement_or_null
statement_or_null ::=
statement | ‘;’
// file property_declarations.h
‘ifndef PROPERTY_DECLARATIONS
‘define PROPERTY_DECLARATIONS
property P_impl_Q_weak_until_R(ck,rst,P,Q,R);
@(posedge ck) disable iff (rst)
$rose(P) ##1 (~R)[*1:$] |-> Q;
endproperty
property P_impl_Q_strong_until_R(ck,rst,P,Q,R);
@(posedge ck) disable iff (rst)
$rose(P) |=> (~R throughout (Q[*0:$])) ##1 R;
endproperty
property P_impl_Q_weak_before_R(ck,rst,P,Q,R);
@(posedge ck) disable iff (rst)
$rose(P) ##1 (~(Q & ~R))[*1:$] |-> ~R;
endproperty
property P_impl_Q_strong_before_R(ck,rst,P,Q,R);
@(posedge ck) disable iff (rst)
$rose(P) |=> (~R throughout Q[=1:$]) ##1 (R & ~Q);
endproperty
‘endif
COMPLETE APPENDIX B
OVM/AVM TESTBENCH
EXAMPLE
In this appendix, we provide a complete OVM/AVM
example to illustrate how to integrate assertion-based IP into
a transaction-level testbench. We have divided this
appendix into two parts. The first part provides the source
code for our simple nonpipelined bus interface example
(previously discussed in Section 5.2 on page 75). The
second part provides a high-level reference for many of the
potentially less obvious OVM/AVM classes used on our
testbench example.
Driver Responder
coverage
Assertion-
Coverage
Based
Collector
Monitor
error
status
Test
Controller
Stimulus
Generator
module top;
import avm_pkg::*;
import tb_tr_pkg::*;
import tb_env_pkg::*;
clk_rst_if clk_rst_bus();
pins_if #(.DATA_SIZE(8),.ADDR_SIZE(8))
nonpiped_bus (
.clk( clk_rst_bus.clk ),
.rst( clk_rst_bus.rst)
);
// assertion-based IP module
tb_monitor_mod tb_monitor(
.bus_if( nonpiped_bus )
);
tb_env env;
initial begin
env = new( nonpiped_bus,
tb_monitor.cov_ap,
tb_monitor.status_ap );
fork
clock_reset_gen.run;
join_none
env.do_test;
$finish;
end
endmodule
initial begin
stop = 0;
end
i.clk = 0;
i.rst = ACTIVE_RESET;
i.rst = !i.rst;
import avm_pkg::*;
import tb_tr_pkg::*;
bit sel;
bit en;
bit write;
bit [DATA_SIZE-1:0] wdata;
bit [DATA_SIZE-1:0] rdata;
bit [ADDR_SIZE-1:0] addr;
modport driver_mp (
input clk , rst ,
output sel , en , write , addr ,
output wdata ,
input rdata
);
modport responder_mp (
input clk , rst ,
input sel , en , write , addr ,
input wdata ,
output rdata
);
modport monitor_mp (
input clk , rst ,
input sel , en , write , addr ,
input wdata ,
input rdata
);
endinterface
import avm_pkg::*;
import tb_tr_pkg::*;
module tb_monitor_mod(
interface bus_if
);
avm_analysis_port #(tb_transaction)
cov_ap = new(“cov_ap”, null);
avm_analysis_port #(tb_status)
status_ap = new(“status_ap”, null);
parameter DATA_SIZE = 8;
parameter ADDR_SIZE = 8;
tb_status status; // See Section B.1.7 (see page 287) for details
// Used to decode bus control signals
bit [ADDR_SIZE-1:0] bus_addr;
bit [DATA_SIZE-1:0] bus_wdata;
bit [DATA_SIZE-1:0] bus_rdata;
bit bus_write;
bit bus_sel;
bit bus_en;
bit bus_reset;
bit bus_inactive;
bit bus_start;
bit bus_active;
bit bus_error;
// Identify conceptual states from bus control signals
always @(posedge bus_if.monitor_mp.clk) begin
bus_addr = bus_if.monitor_mp.addr;
bus_wdata = bus_if.monitor_mp.wdata;
bus_rdata = bus_if.monitor_mp.rdata;
bus_write = bus_if.monitor_mp.write;
bus_sel = bus_if.monitor_mp.sel;
bus_en = bus_if.monitor_mp.en;
// Continued on next page
if (bus_if.monitor_mp.rst) begin
bus_reset = 1;
bus_inactive = 1;
bus_start = 0;
bus_active = 0;
bus_error = 0;
end
else begin
bus_reset = 0;
end
end
// ---------------------------------------------
// REQUIREMENT: Bus legal states
// ---------------------------------------------
property p_reset_inactive;
@(posedge bus_if.monitor_mp.clk)
disable iff (bus_reset)
$past(bus_reset) |-> (bus_inactive);
endproperty
assert property (p_reset_inactive) else begin
status = new();
status.set_err_trans_reset();
status_ap.write(status);
end
property p_valid_inact_trans;
@(posedge bus_if.monitor_mp.clk)
disable iff (bus_reset)
( bus_inactive) |=>
(( bus_inactive) || (bus_start));
endproperty
assert property (p_valid_inact_trans) else begin
status = new();
status.set_err_trans_inactive();
status_ap.write(status);
end
property p_valid_start_trans;
@(posedge bus_if.monitor_mp.clk)
disable iff (bus_reset)
(bus_start) |=> (bus_active);
endproperty
assert property (p_valid_start_trans) else begin
status = new();
status.set_err_trans_start();
status_ap.write(status);
end
property p_valid_active_trans;
@(posedge bus_if.monitor_mp.clk)
disable iff (bus_reset)
(bus_active) |=>
(( bus_inactive | bus_start));
endproperty
assert property (p_valid_active_trans) else begin
status = new();
status.set_err_trans_active();
status_ap.write(status);
end
property p_valid_error_trans;
@(posedge bus_if.monitor_mp.clk)
disable iff (bus_reset)
(~bus_error);
endproperty
assert property (p_valid_error_trans) else begin
status = new();
status.set_err_trans_error();
status_ap.write(status);
end
// ---------------------------------------------
// REQUIREMENT: Bus must remain stable
// ---------------------------------------------
property p_bsel_stable;
@(posedge bus_if.monitor_mp.clk)
disable iff (bus_reset)
(bus_start) |=> ($stable(bus_sel));
endproperty
assert property (p_bsel_stable) else begin
status = new();
status.set_err_stable_sel();
status_ap.write(status);
end
property p_baddr_stable;
@(posedge bus_if.monitor_mp.clk)
disable iff (bus_reset)
(bus_start) |=> $stable(bus_addr);
endproperty
assert property (p_baddr_stable) else begin
status = new();
status.set_err_stable_addr();
status_ap.write(status);
end
property p_bwrite_stable;
@(posedge bus_if.monitor_mp.clk)
disable iff (bus_reset)
(bus_start) |=> $stable(bus_write);
endproperty
assert property (p_bwrite_stable) else begin
status = new();
status.set_err_stable_write();
status_ap.write(status);
end
property p_bwdata_stable;
@(posedge bus_if.monitor_mp.clk)
disable iff (bus_reset)
(bus_start) && (bus_write) |=>
$stable(bus_wdata);
endproperty
assert property (p_bwdata_stable) else begin
status = new();
status.set_err_stable_wdata();
status_ap.write(status);
end
property p_burst_size;
int psize;
@(posedge bus_if.monitor_mp.clk)
((bus_inactive), psize=0)
##1 ((bus_start, psize++, build_tr(psize))
##1 (bus_active))[*1:$]
##1 (bus_inactive);
endproperty
tr = new();
if (bus_write) begin
tr.set_write();
tr.data = bus_wdata;
end
else begin
tr.set_read();
tr.data = bus_rdata;
end
tr.burst_count = psize;
tr.addr = bus_addr;
cov_ap.write(tr);
endfunction
initial begin
bus_reset = 0;
bus_inactive = 0;
bus_start = 0;
bus_active = 0;
end
endmodule
package tb_env_pkg;
import avm_pkg::*;
import tb_tr_pkg::*;
import tb_transactor_pkg::*;
function new(
virtual pins_if #(.DATA_SIZE(8),.ADDR_SIZE(8))
nonpiped_bus,
avm_analysis_port #( tb_transaction ) cov_ap,
avm_analysis_port #( tb_status ) status_ap
);
p_nonpiped_bus = nonpiped_bus;
p_cov_ap = cov_ap;
p_status_ap = status_ap;
p_status_af = new(“status_fifo”);
endfunction
p_stimulus.blocking_put_port.connect (
p_driver.blocking_put_export
);
p_driver.m_bus_if = p_nonpiped_bus;
p_responder.p_bus_if = p_nonpiped_bus;
p_cov_ap.register(
p_coverage.analysis_export
);
p_status_ap.register(
p_status_af.analysis_export
);
endfunction
// Test Controller
task run;
fork
begin
p_stimulus_process = process::self;
p_stimulus.generate_stimulus;
end
terminate_when_timedout;
terminate_on_error;
terminate_when_covered;
join
endtask
task terminate_when_timedout;
#200000;
p_stimulus_process.kill;
avm_report_message(“terminate_when_timedout” , “” );
$finish;
endtask
task terminate_on_error;
string s;
tb_status status;
p_status_af.get( status );
p_stimulus_process.kill;
$sformat (s, “%s”, status.convert2string);
avm_report_error(“terminate_on_error” , s );
$finish;
endtask
// Continued on next page
task terminate_when_covered;
wait( p_coverage.p_is_covered );
p_coverage.report;
p_stimulus_process.kill;
avm_report_warning(“terminate_when_covered” , “” );
$finish;
endtask
endclass
endpackage
package tb_tr_pkg;
import avm_pkg::*;
‘include “tb_transaction.svh”
‘include “tb_status.svh”
endpackage
bus_status_t bus_status;
endclass
package tb_transactor_pkg;
import avm_pkg::*;
import tb_tr_pkg::*;
‘include “tb_stimulus.svh”
‘include “tb_driver.svh”
‘include “tb_responder.svh”
‘include “tb_coverage.svh”
endpackage
if (t == null) t = new;
for( int i = 0;
(max_count == 0 || i < max_count);
i++ ) begin
assert( t.randomize() );
burst_count = t.get_burst_count();
t.decrement_burst_count();
end
end
endtask
endclass
typedef enum {
INACTIVE, START, ACTIVE, ERROR
} tb_driver_state_e;
avm_blocking_put_export #( tb_transaction )
blocking_put_export;
m_state = INACTIVE;
blocking_put_export =
new(“blocking_put_export”, this);
set_report_verbosity_level( 400 );
endfunction
task run;
string m_trans_str;
m_bus_if.driver_mp.en = 0;
m_bus_if.driver_mp.sel = 0;
forever begin
@( posedge m_bus_if.driver_mp.clk );
m_bus_if.driver_mp.en <= 0;
m_bus_if.driver_mp.sel <= 0;
m_state = INACTIVE;
end
else begin
// Conceptual state-machine to
// emulate bus protocol activity
case( m_state )
INACTIVE : begin
m_bus_if.driver_mp.write <= 0;
m_bus_if.driver_mp.en <= 0;
if ( ~m_transaction.is_idle() ) begin
m_bus_if.driver_mp.sel <= 1;
m_state = START;
end
else begin
m_bus_if.driver_mp.sel <= 0;
m_state = INACTIVE;
end
if ( m_transaction.is_write() ) begin
m_bus_if.driver_mp.write <= 1;
m_bus_if.driver_mp.wdata <= m_transaction.get_data()
;
end
end
else begin
avm_report_error (“DRIVER reqest_fifo.try_get failed” ,
“”);
end
end // INACTIVE
START : begin
m_bus_if.driver_mp.sel <= 1;
m_bus_if.driver_mp.en <= 1;
m_state = ACTIVE;
if (m_bus_if.driver_mp.write) begin
avm_report_message(“DRIVER sending “ ,
m_transaction.convert2string );
end
end // START
ACTIVE : begin
if (~m_bus_if.driver_mp.write) begin
$sformat( m_trans_str ,
“Bus type = READ , data = %d , addr = %d” ,
m_bus_if.driver_mp.rdata ,
m_bus_if.driver_mp.addr );
avm_report_message(“DRIVER receiving ” ,
m_trans_str );
end
m_bus_if.driver_mp.en <= 0;
m_bus_if.driver_mp.sel <= 0;
m_state = INACTIVE;
end
else begin
m_bus_if.driver_mp.sel <= 1;
m_state = START;
if ( m_transaction.is_write() ) begin
m_bus_if.driver_mp.write <= 1;
m_bus_if.driver_mp.wdata <=
m_transaction.get_data()
;
end
else begin
m_bus_if.driver_mp.write <= 0;
end
end
else begin
avm_report_error(“DRIVER reqest_fifo.try_get failed”,
“”);
end
end
end // ACTIVE
endcase
end
end
endtask
endclass
task run;
string s_trans_str;
forever begin
@( posedge p_bus_if.responder_mp.clk );
if (p_bus_if.responder_mp.rst) continue;
case( {p_bus_if.responder_mp.sel,p_bus_if.responder_mp.en} )
INACTIVE : begin
end // INACTIVE
START : begin
if (~p_bus_if.responder_mp.write) begin
$sformat( s_trans_str ,
“Bus type = READ , data = %d , addr = %d” ,
p_bus_if.responder_mp.rdata,
p_bus_if.responder_mp.addr);
avm_report_message(“RESPONDER sending “ ,
s_trans_str );
end
end // START
ACTIVE : begin
if (p_bus_if.responder_mp.write) begin
$sformat( s_trans_str ,
“Bus type = WRITE , data = %d , addr = %d” ,
p_bus_if.responder_mp.wdata,
p_bus_if.responder_mp.addr);
avm_report_message(“RESPONDER receiving “ , s_trans_str
);
end
end // ACTIVE
endcase
end
endtask
endclass
bit p_is_covered;
covergroup p_size_cov;
csize : coverpoint tsize;
ctype : coverpoint ttype;
endgroup
p_size_cov = new;
tsize = 0;
p_is_covered = 0;
set_report_verbosity_level( 4 );
af = new(“trans_fifo”,this);
endfunction
task run;
forever begin
af.get(t);
ttype = t.is_write();
tsize++;
avm_random_stimulus #(type
trans_type=avm_transaction)
extends avm_named_component
This is a general purpose unidirectional random
stimulus generator. It is a useful component in its own
right, but can also be used as a template to define other
stimulus generators or extended to add stimulus
generation methods to simplify test writing.
The avm_random_stimulus class generates streams of
trans_type transactions. These streams may be
generated by the randomize() method of trans_type,
1. The OVM is a superset of the 3.0 version of the AVM. The names in this
appendix are discussed in terms of avm_* prefix, which are backwards
compatible, versus the ovm_* names that are being proposed at the time of this
writing.
avm_threaded_component extends
avm_named_component
A threaded component inherits from
avm_named_component and adds the ability to spawn a
run() task at the beginning of the simulation.
avm_transaction
This is the base class for all AVM transactions.
Bibliography 305
[Foster et al., 2006b] H. Foster, L. Loh, B. Rabii, V. Singhal, “Guidelines for
creating a formal verification testplan,” Proc. DVCON, 2006.
[Glasser et al., 2007] M. Glasser, A. Rose, T. Fitzpatrick, D. Rich, H. Foster, The
Verification Cookbook: Advanced Verification Methodology (AVM), Mentor
Graphics Corp, 2007. http://www.mentor.com/go/cookbook.
[Haque et al., 2006] F. Haque, J. Michelson, K. Khan, The Art of Verification with
SystemVerilog Assertions, Verification Central, 2006.
[I2C 2000] I2C Bus Specification, version 2.1, January 2000, http://
www.semiconductors.philips.com/buses/i2c.
[IEEE 1800-2005] IEEE Standard 1800-2005 SystemVerilog: Unified Hardware
Design, Specification and Verification Language, IEEE, Inc., New York,
NY, USA, 2005
[IEEE 1850-2005] IEEE Standard 1850-2005 Property Specification Language
(PSL), IEEE, Inc., New York, NY, USA, 2005.
[ITRS 2003] The International Technology Roadmap for Semiconductors, 2003
Edition, Retrieved July 5, 2007 from the World Wide Web: http://
www.itrs.net/Links/2003ITRS/Home2003.htm.
[Kariniemi and Nurmi 2005] H. Kariniemi and J. Nurmi, Arbitration and Routing
Schemes for on-Chip Packet Networks, Springer, 2005, http://
www.tkt.cs.tut.fi/kurssit/9636/K05/Chapter18.pdf.
[Keating and Bricaud 2002] M. Keating and P. Bricaud, Reuse Methodology
Manual, Kluwer Academic Publishers, 2002.
[Long et al., 2007] J. Long, A, Seawright, H. Foster, “SVA Local Variable Coding
Guidelines for Effective Use,” Proc. DVCon, 2007.
[Marschner 2002] E. Marschner, B. Deadman, G. Martin, “IP Reuse Hardening via
Embedded Sugar Assertions,” Proc. International Workshop on IP-Based
SoC Design, 2002.
[Martin 2002] G. Martin, “UML for embedded systems specification and design:
motivation and overview,” Proc. Design, Automation and Test in Europe,
2002.
[OCP 2003] Open Core Protocol Specification 2.0, Document Revision 1.1, Part
number: 161-000125-0002, 2003, www.ocpip.org.
[Piziali 2004] A. Piziali, Functional Verification Coverage Measurement and
Analysis, Kluwer Academic Publishers, 2004.
[Richards 2003] J. Richards, “Creative assertion and constraint methods for
formal design verification,” Proceedings of DVCon, 2003.
[Ruah et al., 2005] S. Ruah, A. Fedeli, C. Eisner, “Property-Driven Specification
of VLSI design,” Property Based System Design (PROSYD) methodology
document FP6-IST-507219, 2005.
Bibliography 307
Index
Symbols Advanced Verification Methodology
$ 260 (AVM) 20, 35, 41, 47, 51, 57
$assertion 272 assertion-based IP 20
$assertkill 272 AMBA 35, 63, 75, 76, 90
$assertoff 272 analysis port 30, 50, 51, 52, 54, 69, 70, 71,
$asserton 272 72, 83, 86, 99, 109, 138, 142, 162, 258
$countones 270 broadcasting data 30
$display 271 publisher 30
$error 271 subscriber 30, 51
$fatal 271 analysis_fifo class 303
$fell 269 analysis_if class 303
$info 272 arbiter 31, 90, 113
$isunknown 270 credit registers 125
$onehot 270 credits 125
$onehot0 270 grant without pending request 121
$past 269 interleaving request 132
$rose 269 latency 125
$sampled 269 minimum latency 119
$warning 271 mutually exclusive grants 118
[*m:n] 260 natural language properties 136
[*n] 260 round-robin 117, 125
[=n] 262 specific properties 117
[->n] 261 arbitration schemes 114
|=> 268 fair 115, 128
|-> 268 fixed priority 122
variable dynamic priority 128
variable weighted priority 125, 127
A weighted-priority 125
abstraction 31 assertion coverage 31
Accellera Open Verification Library (OVL) assertion-based IP 1, 4, 7, 19, 31, 40
11, 13 academic instructor 14
PSL 11 action 38, 57, 112
SVA 11 ad hoc process 7
Verilog 11 analysis interface 24
Advanced High-performance Bus (AHB) analysis port 24, 30, 50, 51, 52, 69, 70,
35, 63, 90 71, 72, 83, 86, 99, 109, 138,
Advanced Peripheral Bus (APB) 35, 75 142, 162, 258
Index 309
architect 14 avm_env
architecture 41 definition of 301
clarity xvi, 2, 38 avm_named_component class
coverage 108, 112 definition of 301
designer 14 avm_port_base class 302
detection 38, 57, 112 avm_random_stimulus class 301
development philosophy 14 avm_threaded_component class
engineering manager 14 definition of 302
formal verification 14 avm_transaction class 69, 83, 100, 138,
guidelines and conventions 57 163, 303
interface-based 53
libraries 11
modularity xvi, 2, 38
B
behavior 31
module versus interface assertions 41
black box 32
module-based 44
bus functional model (BFM) 32, 35
motivation 3, 17
bus-based design 59, 60, 61
novice 14
optimization 14
process 13, 37, 39 C
provider 15 C or C++ model 7
reuse 1, 11, 17 channel class 303
separating detection from action xvi, 2 tlm_fifo 303
simulation 14 class-based component 49
systematic process 7, 9 communication channel 23
systematic set of steps 37 component classes
systematic steps 39 avm_env 301
terminology 31 avm_named_component 301
verification engineer 14 avm_random_stimulus 301
assertion-based monitor 38 avm_threaded_component 302
assertion-based verification (ABV) 1 conceptual state-machine 77, 152, 168, 169
libraries 11 implicit vs. explicit modeling 175
methodology 11 connector classes
ad hoc 11 avm_*_export 302
reuse 38 avm_*_port 302
assertions 31 avm_analysis_port 52, 302
black-box 6, 14 avm_port_base 302
definition 9 consequent 268
design engineer xv, 5 constraint 32
end-to-end 6 controllers 32
implementation-level xv, 4 memory 145
naming convention 57 corner case 32
verification engineer xv, 5 coverage 32, 108
white-box 6, 14 coverage model 32
assumption 31 coverage property 55
avm_*_export class
definition of 302
avm_*_port class
D
definition of 302 datapath 32
avm_analysis_port class 52, 302 design component 32
Index 311
pipelined bus 63, 90 R
serial bus 63, 64 requirement 34
natural language properties. 67 reuse 70, 72
Inter-Integrated Circuit (I2C) Bus 36, 64 RTL 36
International Technology Roadmap for
Semiconductors (ITRS) 8
S
SDRAM 36, 147, 148, 151, 152, 154, 165,
L 173
libraries DDR 146
encapsulate property set 11 SDR 146
linear-time temporal logic 253 SoC 36, 59, 60, 61, 63
linear-time temporal operators 274 split transaction 90
static verification 34
M SystemVerilog Assertions (SVA) xv, 4
memory controller 146 SystemVerilog interface 37, 45, 48, 54, 55,
burst read cycle 148 56, 68, 82
natural language properties 158 class-based reference 47
single read cycle 148 instantiation 46
single write cycle 148 modport 45, 46, 47, 68, 83, 99, 136, 161
model 33 virtual 49
modularity 27 SystemVerilog module-based assertion
module-based transactor 44 monitor 37
O T
Open Core Protocol (OCP) 63 testbench
Open Verification Library (OVL) 36
architecture
Open Verification Methodology (OVM) 30,
analysis layer 28
36 control layer 28
environment layer 29
P transactors layer 29
parameterized class 52 TLM 36
platform-based design 33, 63 TLM interface classes
properties 6 analysis_if 303
architecture 6 tlm_fifo class 303
definition 9 transaction 34
micro-architectural 6 transaction-level model (TLM) 7
natural language 7, 8 untimed 8
property 34 transactions policy classes
encapsulation 89 AVM transactions, base class for 69,
property encapsulation 75, 108, 141, 173 83, 100, 138, 163, 303
protocol 34
protocol checker 34
V
verification
Q stakeholders
queue architect 6
explicit 213 design engineer 6
implicit 213 verification engineer 6
Index 313
Continued from page ii
Leakage in Nanometer CMOS Technologies
Siva G. Narendra and Anantha Chandrakasan
ISBN 978-0-387-25737-2, 2005