In this directory, we provide commonly used interfaces used to construct testbenches for DV. These interfaces are instantiated inside tb
module for connecting dut signals. They are described in detail below.
clk_if
This is a passive clock interface that is used to wait for clock events in testbenches. This interface has two clocking blocks: cb
and cbn
for synchronizing to positive and negative clock edges. This interface consists of following tasks:
wait_clks
: waits for specified number of positive clock edgeswait_n_clks
: waits for specified number of negative clock edgesclk_rst_if
This interface provides the ability to drive / sample clock and reset signal. It provides various methods related to clock and reset generation. These methods can be categorized into setup methods
and drive / sample
methods. Following are setup methods
of pins_if
:
set_freq_mhz
: set the clk frequency in mhz and calclate period in nsset_duty_cycle
: set the duty cycle (1-99)set_active
: enables clk
and rst_n
generation typically, called at t=0 (from tb top)set_period_ns
: set the clk period in ns and calculate frequency in mhzset_jitter_chance_pc
: set jitter chance in percentage (0 - 100)set_max_jitter_ps
: set maximum jitter in ps Following are drive / sample
methods of pins_if
:wait_for_reset
: wait for rst_n to assert and then deassertapply_reset
: apply reset with specified scheme out of following:add_jitter
: add jitter to clk_hi
and clk_lo
half periods based on jitter_chance_pc
start_clk
: start / ungate clockstop_clk
: stop / gate the clkwait_clks
: waits for specified number of positive clock edgeswait_n_clks
: waits for specified number of negative clock edgespins_if
This paramterized interface provides the ability to drive / sample any signal in the DUT.
interface pins_if #( parameter int Width = 1 ) ( inout [Width-1:0] pins );
The member pins
is inout type and it can be connected to any of input or output port within of dut to drive or sample them. pins
can be driven either internally using pins_o
and pins_oe
signals, that constitute a tri-state buffer implementation. This provide an ability to disconnects pins
by driving them to high impedance state. pins
may also be driven through an external driver that it gets connected to. This interface also provides capability to drive weak pull-up or pull-down on pins
in case of no internal or external drivers. The members pins_pu
and pins_pd
control weak pull-up or pull-down functionality. Following diagram explains working of pins_if
:
pins_if
block diagramSome of the commonly used methods of pins_if
are as follows:
drive_en_pin
: Drive specified value val
on specified index idx
of pins_oe
signaldrive_en
: Drive pins_oe
signal to specified value val
drive_pin
: Drive specified index idx
of pins_oe signal to 1, and the same index of pins_o
to specified value val
valuedrive
: Drive pins_oe
to all 1's and specified value val
on pins_o
sample_pin
: Sample and return value of pins[idx]
for specified index idx
sample
: Sample and return value of pins
set_pullup_en
: Implement pull-up on specific bits of pins
based on specified value val
set_pulldown_en
: Implement pull-down on specifc bits of pins
based on specified value val