P2L2 VIP MDIO

Quick Access

BFM

BFM functionality is implemented in mdio_bfm_pkg.vhd

The BFM implements the MDIO management interface of IEEE 802.3, clause 22 and clause 45. It acts either as the station management entity (STA, the bus master that drives MDC) with the mdio_sta_* procedures, or as the PHY (the addressed target) with the mdio_phy_* procedures. See Abbreviations for the abbreviations used in this document.

Signal Record

t_mdio_if

Record element

Type

Description

mdc

std_logic

Management data clock, driven by the STA.

mdio

std_logic

Management data input/output. Tri-state bus, driven by the STA and by the PHY.

Note

MDIO needs a pull-up. When only the BFM is used, add a weak pull-up in the test harness, e.g. mdio <= 'H';. The VVC can drive the pull-up itself with the entity generic GC_MDIO_PULLUP set to true, see Signals.

Configuration Record

t_mdio_bfm_config

Default value for the record is C_MDIO_BFM_CONFIG_DEFAULT.

Record element

Type

Default

Description

min_setup_time

time

10 ns

Minimum time MDIO must be stable before a rising MDC edge

min_hold_time

time

10 ns

Minimum time MDIO must be stable after a rising MDC edge

min_mdc_period

time

400 ns

Minimum time between two rising and between two falling MDC edges

min_mdc_high_time

time

160 ns

Minimum MDC high time

min_mdc_low_time

time

160 ns

Minimum MDC low time

output_delay

time

150 ns

Time from a rising MDC edge until MDIO is driven, in both roles. IEEE 802.3 22.3.4 allows 0 ns to 300 ns for a PHY. The STA must hold MDIO at least 10 ns, output_delay 0 ns is rejected for the STA (TB_FAILURE).

id_for_bfm

t_msg_id

ID_BFM

Message ID used for logging general messages in the BFM

id_for_bfm_wait

t_msg_id

ID_BFM_WAIT

Message ID used for logging waits in the BFM

suppress_preamble

boolean

false

True: the STA sends no preamble and the PHY procedures expect none.

sync_to_frame_start

boolean

true

True: a PHY call waits for the next frame start, also if started during other bus activity. False: the first frame must start at the next rising MDC edge.

protocol_error_severity

t_alert_level

ERROR

Severity if a frame breaks the MDIO protocol, e.g. wrong turnaround, undefined bits, preamble too short. NO_ALERT disables these checks.

undriven_severity

t_alert_level

ERROR

Severity if a bit the sender must drive is only pulled (‘H’ / ‘L’). The value still counts. NO_ALERT disables the check, e.g. for an open-drain DUT.

bus_contention_severity

t_alert_level

ERROR

Severity if the bus does not show the value driven by the BFM, or is driven where it must be released.

timing_violation_severity

t_alert_level

ERROR

Severity if the configured timing of the BFM is out of specification. NO_ALERT allows out-of-spec timing on purpose.

phy

t_mdio_phy_bfm_config

C_MDIO_PHY_BFM_CONFIG_DEFAULT

Configuration of the PHY role, see below

sta

t_mdio_sta_bfm_config

C_MDIO_STA_BFM_CONFIG_DEFAULT

Configuration of the STA role, see below

t_mdio_phy_bfm_config (default C_MDIO_PHY_BFM_CONFIG_DEFAULT)

Record element

Type

Default

Description

phy_address

unsigned(4 downto 0)

5x”1”

Address of the PHY: PHYAD (clause 22) / PRTAD (clause 45)

max_wait_mdc_change

time

1 ms

Maximum time between two rising MDC edges within a frame, 0 ns = no timeout (a stalled frame then waits until terminated).

max_wait_mdc_change_severity

t_alert_level

FAILURE

Severity of the above timeout

timeout

time

10 ms

Maximum time to wait for the addressed frame to start, 0 ns = no timeout. Can be overridden per call.

timeout_severity

t_alert_level

ERROR

Severity of the above timeout

t_mdio_sta_bfm_config (default C_MDIO_STA_BFM_CONFIG_DEFAULT)

Record element

Type

Default

Description

mdc_period

time

400 ns

Period of the MDC generated by the STA (50 % duty cycle)

preamble_length

natural

32

Number of preamble bits. Other values than 32 are meant for negative tests.

idle_cycles

natural

1

IDLE bits (MDC running, MDIO released) after every frame. 0 is meant for negative tests.

turnaround_not_driven_severity

t_alert_level

ERROR

Severity if the PHY does not drive ‘0’ in the second turnaround bit of a read, i.e. no PHY answered

Methods

  • All parameters in brackets are optional.

  • mdio_sta_* procedures act as the STA, mdio_phy_* procedures act as the PHY. c22 / c45 in the name selects the clause 22 / clause 45 frame format.

  • ‘terminate_loop’ aborts a call when set to ‘1’: the bus is released and ID_TERMINATE_CMD is logged, without an alert. In an MDC high phase, an STA procedure waits for the falling edge, so MDC never gets a short high pulse.

  • Every value a procedure drives onto the bus (the addresses and the write data / register address of the STA, the read data a PHY replies with) should contain ‘0’ / ‘1’ only. A ‘Z’ or ‘H’ bit is only pulled up, a ‘-’, ‘X’ or ‘U’ bit puts an ‘X’ on the bus. Such a value is a TB_ERROR at the call (one per field), but it is still driven as given: with the TB_ERROR expected, an STA can inject undefined or undriven bits to test a PHY. A PHY replying with such bits also gets a bus contention alert for them (config.bus_contention_severity). Expected values (‘data_exp’, the expected register address and data of a PHY) are only compared, so ‘-’ (don’t care) is allowed there.

STA procedures

  • The STA generates MDC with config.sta.mdc_period (idle low between calls) and sends config.sta.preamble_length ‘1’ bits before every frame (none with config.suppress_preamble). After every frame it clocks config.sta.idle_cycles IDLE bits with MDIO released.

  • MDIO is driven config.output_delay after the rising MDC edge. IEEE 802.3 22.3.4 requires the STA to hold MDIO at least 10 ns, so config.output_delay must be greater than 0 ns.

  • The target is a parameter of every call (‘phy_addr’, and ‘dev_addr’ for clause 45), as an STA talks to several PHYs and MMDs.

  • The STA never waits for the PHY, so there is no timeout parameter.

PHY procedures

Important

The BFM does not model registers or the clause 45 address register: the testbench decides what is expected or returned.

  • The address of the PHY is config.phy.phy_address. One PHY address is served by one caller (one VVC), which handles all its MMDs: several callers on the same address would take each other’s frames.

  • A call waits for the next valid frame that addresses this PHY: at least 32 preamble ‘1’ bits followed by ST, so a call may start in the middle of other traffic (config.sync_to_frame_start). Frames to other PHYs are skipped, their turnaround is checked. A read to an address without a PHY (e.g. the STA scans the bus) is not reported.

  • The addressed frame is taken whatever its clause and DEVAD. A frame of the other clause, or a clause 45 frame to another MMD than ‘dev_addr’, is reported with ‘alert_level’. A frame of the other clause is consumed without driving the bus, a frame to another MMD is handled like the expected one (e.g. a read is replied).

  • With config.sync_to_frame_start = false, the preamble is the ‘1’ bits the STA drives before ST; idle or only pulled-up (‘H’) bits are not counted.

  • The ‘timeout’ applies until the addressed frame starts, a started frame is always completed.

  • The *_receive_* procedures make the same checks as the *_expect_* procedures, but return the 16 bits the STA sent instead of comparing them.

Note

The PHY samples MDIO at the rising MDC edge. A zero-delay RTL STA that changes MDIO in the same delta cycle as MDC is out of specification (0 ns hold time) and is not received correctly. The bus timing checker of the VVC reports it.

mdio_sta_c22_write()

Writes ‘data’ to register ‘reg_addr’ of the PHY ‘phy_addr’ with a clause 22 write frame. For protocol details, see Additional Documentation.

The procedure reports an alert if:

  • A bit driven by the STA does not show on the bus, or the bus is not released after the frame (config.bus_contention_severity).

  • The configured timing violates the min_* settings of the config (config.timing_violation_severity).

  • ‘phy_addr’, ‘reg_addr’ or ‘data’ contain bits other than ‘0’ / ‘1’ (TB_ERROR, one per field). The value is still driven as given.

  • config.sta.mdc_period is not greater than 0 ns (TB_FAILURE).

  • config.output_delay is not greater than 0 ns (TB_FAILURE).

  • config.output_delay is not shorter than config.sta.mdc_period (TB_FAILURE).

mdio_sta_c22_write(phy_addr, reg_addr, data, msg, mdio_if, terminate_loop, [scope, [msg_id_panel, [config]]])

Object

Name

Dir.

Type

Description

constant

phy_addr

in

unsigned(4 downto 0)

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45)

constant

reg_addr

in

unsigned(4 downto 0)

Register address (REGAD)

constant

data

in

std_ulogic_vector(15 downto 0)

The data value to be written to the register

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_sta_c22_write(5x"01", 5x"00", x"1340", "Restart autonegotiation", mdio_if, terminate_loop);
mdio_sta_c22_write(5x"01", 5x"00", x"1340", "Restart autonegotiation", mdio_if, terminate_loop, C_SCOPE,
                   shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_sta_c22_write(5x"01", 5x"00", x"1340", "Restart autonegotiation");

mdio_sta_c22_read()

Reads register ‘reg_addr’ of the PHY ‘phy_addr’ with a clause 22 read frame and returns the data in ‘data’. ‘data’ is set to all ‘X’ at the start of the call and only assigned after a complete frame.

The procedure reports an alert if:

  • A bit driven by the STA does not show on the bus, or the bus is not released after the frame (config.bus_contention_severity).

  • The first turnaround bit is not released, i.e. is driven by someone (config.bus_contention_severity).

  • The PHY does not drive ‘0’ in the second turnaround bit (config.sta.turnaround_not_driven_severity), e.g. no PHY at that address. The data is still returned, typically all ones, so this check can be disabled to scan for PHYs.

  • The read data contains undefined bits (config.protocol_error_severity). ‘H’ and ‘L’ count as ‘1’ and ‘0’.

  • The PHY drove the second turnaround bit, but read data bits are only pulled (‘H’ / ‘L’) (config.undriven_severity). The data is still returned and compared.

  • The configured timing violates the min_* settings of the config, or config.sta.mdc_period is below 300 ns + config.min_setup_time (config.timing_violation_severity).

  • ‘phy_addr’ or ‘reg_addr’ contain bits other than ‘0’ / ‘1’ (TB_ERROR, one per field). The value is still driven as given.

  • config.sta.mdc_period is not greater than 0 ns (TB_FAILURE).

  • config.output_delay is not greater than 0 ns (TB_FAILURE).

  • config.output_delay is not shorter than config.sta.mdc_period (TB_FAILURE).

mdio_sta_c22_read(phy_addr, reg_addr, data, msg, mdio_if, terminate_loop, [scope, [msg_id_panel, [config]]])

Object

Name

Dir.

Type

Description

constant

phy_addr

in

unsigned(4 downto 0)

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45)

constant

reg_addr

in

unsigned(4 downto 0)

Register address (REGAD)

variable

data

out

std_ulogic_vector(15 downto 0)

The data value read from the register. All ‘X’ if the call ended without a complete frame.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_sta_c22_read(5x"01", 5x"01", v_data, "Read status register", mdio_if, terminate_loop);
mdio_sta_c22_read(5x"01", 5x"01", v_data, "Read status register", mdio_if, terminate_loop, C_SCOPE,
                  shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_sta_c22_read(5x"01", 5x"01", v_data, "Read status register");

mdio_sta_c22_check()

Reads register ‘reg_addr’ of the PHY ‘phy_addr’, using the read procedure as described in mdio_sta_c22_read(). After receiving data, the data is compared with the expected data.

  • If the check was successful, and the read data matches the expected data, a log message is written with ID ‘config.id_for_bfm’.

  • If the read data did not match the expected data, an alert with severity ‘alert_level’ will be reported.

  • The data is only compared if the turnaround and the data bits were fine, otherwise that alert is reported instead of a misleading data mismatch.

  • The procedure will report alerts for the same conditions as the mdio_sta_c22_read() procedure.

mdio_sta_c22_check(phy_addr, reg_addr, data_exp, msg, mdio_if, terminate_loop, [alert_level, [scope, [msg_id_panel, [config]]]])

Object

Name

Dir.

Type

Description

constant

phy_addr

in

unsigned(4 downto 0)

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45)

constant

reg_addr

in

unsigned(4 downto 0)

Register address (REGAD)

constant

data_exp

in

std_ulogic_vector(15 downto 0)

The data value to expect when reading the register. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

alert_level

in

t_alert_level

Sets the severity for the alert if the read data does not match. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_sta_c22_check(5x"01", 5x"01", x"796D", "Check status register", mdio_if, terminate_loop);
mdio_sta_c22_check(5x"01", 5x"01", x"796D", "Check status register", mdio_if, terminate_loop, ERROR, C_SCOPE,
                   shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_sta_c22_check(5x"01", 5x"01", x"796D", "Check status register");

mdio_sta_c45_address()

Sends a clause 45 address frame: sets the register address of the MMD ‘dev_addr’ in the PHY ‘phy_addr’ to ‘reg_addr’. The following write and read frames to this MMD access that register address.

The overload with the ‘success’ output returns false if the frame was terminated, an argument had bits other than ‘0’ / ‘1’ (TB_ERROR), or a bus check of the frame failed: a bit driven by the STA did not show on the bus, or the bus was not released after the frame (config.bus_contention_severity). A caller can then skip the access frame that would follow. Alerts from the timing check of the configuration (config.timing_violation_severity) do not set ‘success’ to false, and a check disabled with NO_ALERT counts as passed. The VVC uses it for the *_reg methods.

The procedure reports an alert if:

  • A bit driven by the STA does not show on the bus, or the bus is not released after the frame (config.bus_contention_severity).

  • The configured timing violates the min_* settings of the config (config.timing_violation_severity).

  • ‘phy_addr’, ‘dev_addr’ or ‘reg_addr’ contain bits other than ‘0’ / ‘1’ (TB_ERROR, one per field). The value is still driven as given.

  • config.sta.mdc_period is not greater than 0 ns (TB_FAILURE).

  • config.output_delay is not greater than 0 ns (TB_FAILURE).

  • config.output_delay is not shorter than config.sta.mdc_period (TB_FAILURE).

mdio_sta_c45_address(phy_addr, dev_addr, reg_addr, msg, mdio_if, terminate_loop, [scope, [msg_id_panel, [config]]])
mdio_sta_c45_address(phy_addr, dev_addr, reg_addr, success, msg, mdio_if, terminate_loop, [scope, [msg_id_panel, [config]]])

Object

Name

Dir.

Type

Description

constant

phy_addr

in

unsigned(4 downto 0)

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45)

constant

dev_addr

in

unsigned(4 downto 0)

Address of the target MMD within the PHY (DEVAD)

constant

reg_addr

in

unsigned(15 downto 0)

Register address sent in the address frame

variable

success

out

boolean

False if the frame was terminated, an argument had bits other than ‘0’ / ‘1’ or a bus check failed (config.bus_contention_severity)

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_sta_c45_address(5x"01", 5x"03", x"0000", "Select PCS control register", mdio_if, terminate_loop);
mdio_sta_c45_address(5x"01", 5x"03", x"0000", v_success, "Select PCS control register", mdio_if, terminate_loop);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_sta_c45_address(5x"01", 5x"03", x"0000", "Select PCS control register");

mdio_sta_c45_write()

Writes ‘data’ to the register at the current address of the MMD ‘dev_addr’ in the PHY ‘phy_addr’ with a clause 45 write frame. The register address is set with mdio_sta_c45_address() before.

The procedure reports an alert if:

  • A bit driven by the STA does not show on the bus, or the bus is not released after the frame (config.bus_contention_severity).

  • The configured timing violates the min_* settings of the config (config.timing_violation_severity).

  • ‘phy_addr’, ‘dev_addr’ or ‘data’ contain bits other than ‘0’ / ‘1’ (TB_ERROR, one per field). The value is still driven as given.

  • config.sta.mdc_period is not greater than 0 ns (TB_FAILURE).

  • config.output_delay is not greater than 0 ns (TB_FAILURE).

  • config.output_delay is not shorter than config.sta.mdc_period (TB_FAILURE).

mdio_sta_c45_write(phy_addr, dev_addr, data, msg, mdio_if, terminate_loop, [scope, [msg_id_panel, [config]]])

Object

Name

Dir.

Type

Description

constant

phy_addr

in

unsigned(4 downto 0)

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45)

constant

dev_addr

in

unsigned(4 downto 0)

Address of the target MMD within the PHY (DEVAD)

constant

data

in

std_ulogic_vector(15 downto 0)

The data value to be written to the register

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_sta_c45_write(5x"01", 5x"03", x"2040", "Write PCS control register", mdio_if, terminate_loop);
mdio_sta_c45_write(5x"01", 5x"03", x"2040", "Write PCS control register", mdio_if, terminate_loop, C_SCOPE,
                   shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_sta_c45_write(5x"01", 5x"03", x"2040", "Write PCS control register");

mdio_sta_c45_read()

Reads the register at the current address of the MMD ‘dev_addr’ in the PHY ‘phy_addr’ with a clause 45 read frame and returns the data in ‘data’. The register address is set with mdio_sta_c45_address() before. ‘data’ is set to all ‘X’ at the start of the call and only assigned after a complete frame.

The procedure reports an alert if:

  • A bit driven by the STA does not show on the bus, or the bus is not released after the frame (config.bus_contention_severity).

  • The first turnaround bit is not released, i.e. is driven by someone (config.bus_contention_severity).

  • The PHY does not drive ‘0’ in the second turnaround bit (config.sta.turnaround_not_driven_severity), e.g. no PHY at that address. The data is still returned, typically all ones, so this check can be disabled to scan for PHYs.

  • The read data contains undefined bits (config.protocol_error_severity). ‘H’ and ‘L’ count as ‘1’ and ‘0’.

  • The PHY drove the second turnaround bit, but read data bits are only pulled (‘H’ / ‘L’) (config.undriven_severity). The data is still returned and compared.

  • The configured timing violates the min_* settings of the config, or config.sta.mdc_period is below 300 ns + config.min_setup_time (config.timing_violation_severity).

  • ‘phy_addr’ or ‘dev_addr’ contain bits other than ‘0’ / ‘1’ (TB_ERROR, one per field). The value is still driven as given.

  • config.sta.mdc_period is not greater than 0 ns (TB_FAILURE).

  • config.output_delay is not greater than 0 ns (TB_FAILURE).

  • config.output_delay is not shorter than config.sta.mdc_period (TB_FAILURE).

mdio_sta_c45_read(phy_addr, dev_addr, data, msg, mdio_if, terminate_loop, [scope, [msg_id_panel, [config]]])

Object

Name

Dir.

Type

Description

constant

phy_addr

in

unsigned(4 downto 0)

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45)

constant

dev_addr

in

unsigned(4 downto 0)

Address of the target MMD within the PHY (DEVAD)

variable

data

out

std_ulogic_vector(15 downto 0)

The data value read from the register. All ‘X’ if the call ended without a complete frame.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_sta_c45_read(5x"01", 5x"03", v_data, "Read PCS control register", mdio_if, terminate_loop);
mdio_sta_c45_read(5x"01", 5x"03", v_data, "Read PCS control register", mdio_if, terminate_loop, C_SCOPE,
                  shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_sta_c45_read(5x"01", 5x"03", v_data, "Read PCS control register");

mdio_sta_c45_post_read_increment()

Reads the register at the current address of the MMD ‘dev_addr’ in the PHY ‘phy_addr’ with a clause 45 post-read-increment-address frame, which tells the MMD to increment its address after the read.

The procedure will report alerts for the same conditions as the mdio_sta_c45_read() procedure.

mdio_sta_c45_post_read_increment(phy_addr, dev_addr, data, msg, mdio_if, terminate_loop, [scope, [msg_id_panel, [config]]])

Object

Name

Dir.

Type

Description

constant

phy_addr

in

unsigned(4 downto 0)

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45)

constant

dev_addr

in

unsigned(4 downto 0)

Address of the target MMD within the PHY (DEVAD)

variable

data

out

std_ulogic_vector(15 downto 0)

The data value read from the register. All ‘X’ if the call ended without a complete frame.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_sta_c45_post_read_increment(5x"01", 5x"03", v_data, "Read PCS register, increment", mdio_if, terminate_loop);
mdio_sta_c45_post_read_increment(5x"01", 5x"03", v_data, "Read PCS register, increment", mdio_if, terminate_loop,
                                 C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_sta_c45_post_read_increment(5x"01", 5x"03", v_data, "Read PCS register, increment");

mdio_sta_c45_check()

Reads the register at the current address of the MMD ‘dev_addr’, using the read procedure as described in mdio_sta_c45_read(). After receiving data, the data is compared with the expected data.

  • If the check was successful, and the read data matches the expected data, a log message is written with ID ‘config.id_for_bfm’.

  • If the read data did not match the expected data, an alert with severity ‘alert_level’ will be reported.

  • The data is only compared if the turnaround and the data bits were fine, otherwise that alert is reported instead of a misleading data mismatch.

  • The procedure will report alerts for the same conditions as the mdio_sta_c45_read() procedure.

mdio_sta_c45_check(phy_addr, dev_addr, data_exp, msg, mdio_if, terminate_loop, [alert_level, [scope, [msg_id_panel, [config]]]])

Object

Name

Dir.

Type

Description

constant

phy_addr

in

unsigned(4 downto 0)

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45)

constant

dev_addr

in

unsigned(4 downto 0)

Address of the target MMD within the PHY (DEVAD)

constant

data_exp

in

std_ulogic_vector(15 downto 0)

The data value to expect when reading the register. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

alert_level

in

t_alert_level

Sets the severity for the alert if the read data does not match. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_sta_c45_check(5x"01", 5x"03", x"2040", "Check PCS control register", mdio_if, terminate_loop);
mdio_sta_c45_check(5x"01", 5x"03", x"2040", "Check PCS control register", mdio_if, terminate_loop, ERROR,
                   C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_sta_c45_check(5x"01", 5x"03", x"2040", "Check PCS control register");

mdio_sta_c45_check_post_read_increment()

Reads the register at the current address of the MMD ‘dev_addr’, using the post-read-increment procedure as described in mdio_sta_c45_post_read_increment(). After receiving data, the data is compared with the expected data in the same way as in mdio_sta_c45_check().

The procedure will report alerts for the same conditions as the mdio_sta_c45_read() procedure.

mdio_sta_c45_check_post_read_increment(phy_addr, dev_addr, data_exp, msg, mdio_if, terminate_loop, [alert_level, [scope, [msg_id_panel, [config]]]])

Object

Name

Dir.

Type

Description

constant

phy_addr

in

unsigned(4 downto 0)

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45)

constant

dev_addr

in

unsigned(4 downto 0)

Address of the target MMD within the PHY (DEVAD)

constant

data_exp

in

std_ulogic_vector(15 downto 0)

The data value to expect when reading the register. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

alert_level

in

t_alert_level

Sets the severity for the alert if the read data does not match. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_sta_c45_check_post_read_increment(5x"01", 5x"03", x"2040", "Check PCS register, increment", mdio_if,
                                       terminate_loop);
mdio_sta_c45_check_post_read_increment(5x"01", 5x"03", x"2040", "Check PCS register, increment", mdio_if,
                                       terminate_loop, ERROR, C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_sta_c45_check_post_read_increment(5x"01", 5x"03", x"2040", "Check PCS register, increment");

mdio_phy_c22_expect_write()

Waits for a clause 22 write frame to register ‘reg_addr’ of this PHY (config.phy.phy_address) and compares the written data with ‘data’. If the data matches, a log message is written with ID ‘config.id_for_bfm’. For protocol details, see Additional Documentation.

The procedure reports an alert if:

  • No addressed frame starts within ‘timeout’ (config.phy.timeout_severity).

  • MDC does not change within config.phy.max_wait_mdc_change during a frame (config.phy.max_wait_mdc_change_severity).

  • The addressed frame has the wrong clause (ST), DEVAD (clause 45), opcode, register address (clause 22) or data (‘alert_level’).

  • ST, OP, address fields or the written data contain undefined bits, the turnaround of a write or address frame is not “10”, or the STA drives fewer than 32 preamble bits (config.protocol_error_severity).

  • Preamble, ST, OP, address fields, the turnaround of a write or address frame or the written data are only pulled (‘H’ / ‘L’) instead of driven by the STA (config.undriven_severity). The data is still compared.

  • With config.suppress_preamble and config.sync_to_frame_start = false, the first bit is not the ‘0’ of ST (config.protocol_error_severity). The call ends.

  • In a frame to another target, the preamble, ST / OP / address field and turnaround checks above also apply. In a read to another target, turnaround bit 1 is driven (config.bus_contention_severity), or turnaround bit 0 is neither ‘0’ nor undriven (config.protocol_error_severity).

  • ‘timeout’ is negative (TB_FAILURE). The call returns without waiting.

  • config.phy.max_wait_mdc_change is negative (TB_FAILURE). The call returns without waiting.

mdio_phy_c22_expect_write(reg_addr, data, msg, mdio_if, terminate_loop, [timeout, [alert_level, [scope, [msg_id_panel, [config]]]]])

Object

Name

Dir.

Type

Description

constant

reg_addr

in

unsigned(4 downto 0)

Register address (REGAD) the frame must access. A different address results in an alert with severity ‘alert_level’.

constant

data

in

std_ulogic_vector(15 downto 0)

The data value to expect in the write frame. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

in

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. A started frame is always completed. Default value is C_UNDEFINED_TIME, which uses config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong opcode, wrong register address or wrong written data. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_phy_c22_expect_write(5x"00", x"1340", "Expect control register write", mdio_if, terminate_loop);
mdio_phy_c22_expect_write(5x"00", x"1340", "Expect control register write", mdio_if, terminate_loop, 1 ms, ERROR,
                          C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_phy_c22_expect_write(5x"00", x"1340", "Expect control register write");

mdio_phy_c22_receive_write()

Waits for a clause 22 write frame to register ‘reg_addr’ of this PHY and returns the written data in ‘data’. ‘data’ is set to all ‘X’ at the start of the call and only assigned once the data was received with the right opcode.

The procedure will report alerts for the same conditions as the mdio_phy_c22_expect_write() procedure. A data mismatch is not possible.

mdio_phy_c22_receive_write(reg_addr, data, msg, mdio_if, terminate_loop, [timeout, [alert_level, [scope, [msg_id_panel, [config]]]]])

Object

Name

Dir.

Type

Description

constant

reg_addr

in

unsigned(4 downto 0)

Register address (REGAD) the frame must access. A different address results in an alert with severity ‘alert_level’.

variable

data

out

std_ulogic_vector(15 downto 0)

The data value written by the STA. All ‘X’ if the call ended without a complete frame.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

in

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. A started frame is always completed. Default value is C_UNDEFINED_TIME, which uses config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong opcode or wrong register address. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_phy_c22_receive_write(5x"00", v_data, "Receive control register write", mdio_if, terminate_loop);
mdio_phy_c22_receive_write(5x"00", v_data, "Receive control register write", mdio_if, terminate_loop, 1 ms, ERROR,
                           C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_phy_c22_receive_write(5x"00", v_data, "Receive control register write");

mdio_phy_c22_reply_read()

Waits for a clause 22 read frame of register ‘reg_addr’ of this PHY and returns ‘data’ to the STA. MDIO is driven config.output_delay after the rising MDC edge.

The procedure reports an alert if:

  • No addressed frame starts within ‘timeout’ (config.phy.timeout_severity).

  • MDC does not change within config.phy.max_wait_mdc_change during a frame (config.phy.max_wait_mdc_change_severity).

  • The addressed frame has the wrong clause (ST), DEVAD (clause 45), opcode or register address (clause 22) (‘alert_level’).

  • ST, OP or address fields contain undefined bits, or the STA drives fewer than 32 preamble bits (config.protocol_error_severity).

  • Preamble, ST, OP or address fields are only pulled (‘H’ / ‘L’) instead of driven by the STA (config.undriven_severity).

  • The STA does not release the first turnaround bit, or the bus does not show the bits driven by the PHY (config.bus_contention_severity).

  • config.output_delay is above 300 ns (config.timing_violation_severity).

  • With config.suppress_preamble and config.sync_to_frame_start = false, the first bit is not the ‘0’ of ST (config.protocol_error_severity). The call ends.

  • In a frame to another target, the preamble and ST / OP / address field checks above also apply. In a write or address frame to another target, the turnaround is not “10” (config.protocol_error_severity) or only pulled (config.undriven_severity). In a read to another target, turnaround bit 1 is driven (config.bus_contention_severity), or turnaround bit 0 is neither ‘0’ nor undriven (config.protocol_error_severity).

  • ‘timeout’ is negative (TB_FAILURE). The call returns without waiting.

  • config.phy.max_wait_mdc_change is negative (TB_FAILURE). The call returns without waiting.

  • config.output_delay is negative (TB_FAILURE).

  • config.output_delay is not shorter than config.min_mdc_period (TB_FAILURE).

  • ‘data’ contains bits other than ‘0’ / ‘1’ (TB_ERROR). It is still driven as given, so those bits also get a bus contention alert.

mdio_phy_c22_reply_read(reg_addr, data, msg, mdio_if, terminate_loop, [timeout, [alert_level, [scope, [msg_id_panel, [config]]]]])

Object

Name

Dir.

Type

Description

constant

reg_addr

in

unsigned(4 downto 0)

Register address (REGAD) the frame must access. A different address results in an alert with severity ‘alert_level’.

constant

data

in

std_ulogic_vector(15 downto 0)

The data value returned to the STA

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. A started frame is always completed. Default value is C_UNDEFINED_TIME, which uses config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong opcode or wrong register address. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_phy_c22_reply_read(5x"01", x"796D", "Reply status register", mdio_if, terminate_loop);
mdio_phy_c22_reply_read(5x"01", x"796D", "Reply status register", mdio_if, terminate_loop, 1 ms, ERROR,
                        C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_phy_c22_reply_read(5x"01", x"796D", "Reply status register");

mdio_phy_c45_expect_address()

Waits for a clause 45 address frame to the MMD ‘dev_addr’ of this PHY and compares the received register address with ‘reg_addr’. The BFM does not model the clause 45 address register: the testbench decides which register the following frames access.

The procedure will report alerts for the same conditions as the mdio_phy_c22_expect_write() procedure.

mdio_phy_c45_expect_address(dev_addr, reg_addr, msg, mdio_if, terminate_loop, [timeout, [alert_level, [scope, [msg_id_panel, [config]]]]])

Object

Name

Dir.

Type

Description

constant

dev_addr

in

unsigned(4 downto 0)

MMD within this PHY (DEVAD) that the frame must address. A frame to another MMD is alerted (‘alert_level’).

constant

reg_addr

in

unsigned(15 downto 0)

Expected register address in the address frame. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

in

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. A started frame is always completed. Default value is C_UNDEFINED_TIME, which uses config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD, wrong opcode or wrong register address in the address frame. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_phy_c45_expect_address(5x"03", x"0000", "Expect PCS control register address", mdio_if, terminate_loop);
mdio_phy_c45_expect_address(5x"03", x"0000", "Expect PCS control register address", mdio_if, terminate_loop,
                            1 ms, ERROR, C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_phy_c45_expect_address(5x"03", x"0000", "Expect PCS control register address");

mdio_phy_c45_receive_address()

Waits for a clause 45 address frame to the MMD ‘dev_addr’ of this PHY and returns the received register address in ‘reg_addr’. ‘reg_addr’ is set to all ‘X’ at the start of the call and only assigned once the address was received with the right opcode.

The procedure will report alerts for the same conditions as the mdio_phy_c22_expect_write() procedure. An address mismatch is not possible.

mdio_phy_c45_receive_address(dev_addr, reg_addr, msg, mdio_if, terminate_loop, [timeout, [alert_level, [scope, [msg_id_panel, [config]]]]])

Object

Name

Dir.

Type

Description

constant

dev_addr

in

unsigned(4 downto 0)

MMD within this PHY (DEVAD) that the frame must address. A frame to another MMD is alerted (‘alert_level’).

variable

reg_addr

out

unsigned(15 downto 0)

The register address received in the address frame. All ‘X’ if the call ended without a complete frame.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

in

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. A started frame is always completed. Default value is C_UNDEFINED_TIME, which uses config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD or wrong opcode. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_phy_c45_receive_address(5x"03", v_reg_addr, "Receive PCS register address", mdio_if, terminate_loop);
mdio_phy_c45_receive_address(5x"03", v_reg_addr, "Receive PCS register address", mdio_if, terminate_loop,
                             1 ms, ERROR, C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_phy_c45_receive_address(5x"03", v_reg_addr, "Receive PCS register address");

mdio_phy_c45_expect_write()

Waits for a clause 45 write frame to the MMD ‘dev_addr’ of this PHY and compares the written data with ‘data’. If the data matches, a log message is written with ID ‘config.id_for_bfm’.

The procedure will report alerts for the same conditions as the mdio_phy_c22_expect_write() procedure.

mdio_phy_c45_expect_write(dev_addr, data, msg, mdio_if, terminate_loop, [timeout, [alert_level, [scope, [msg_id_panel, [config]]]]])

Object

Name

Dir.

Type

Description

constant

dev_addr

in

unsigned(4 downto 0)

MMD within this PHY (DEVAD) that the frame must address. A frame to another MMD is alerted (‘alert_level’).

constant

data

in

std_ulogic_vector(15 downto 0)

The data value to expect in the write frame. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

in

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. A started frame is always completed. Default value is C_UNDEFINED_TIME, which uses config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD, wrong opcode or wrong written data. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_phy_c45_expect_write(5x"03", x"2040", "Expect PCS control register write", mdio_if, terminate_loop);
mdio_phy_c45_expect_write(5x"03", x"2040", "Expect PCS control register write", mdio_if, terminate_loop,
                          1 ms, ERROR, C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_phy_c45_expect_write(5x"03", x"2040", "Expect PCS control register write");

mdio_phy_c45_receive_write()

Waits for a clause 45 write frame to the MMD ‘dev_addr’ of this PHY and returns the written data in ‘data’. ‘data’ is set to all ‘X’ at the start of the call and only assigned once the data was received with the right opcode.

The procedure will report alerts for the same conditions as the mdio_phy_c22_expect_write() procedure. A data mismatch is not possible.

mdio_phy_c45_receive_write(dev_addr, data, msg, mdio_if, terminate_loop, [timeout, [alert_level, [scope, [msg_id_panel, [config]]]]])

Object

Name

Dir.

Type

Description

constant

dev_addr

in

unsigned(4 downto 0)

MMD within this PHY (DEVAD) that the frame must address. A frame to another MMD is alerted (‘alert_level’).

variable

data

out

std_ulogic_vector(15 downto 0)

The data value written by the STA. All ‘X’ if the call ended without a complete frame.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

in

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. A started frame is always completed. Default value is C_UNDEFINED_TIME, which uses config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD or wrong opcode. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_phy_c45_receive_write(5x"03", v_data, "Receive PCS control register write", mdio_if, terminate_loop);
mdio_phy_c45_receive_write(5x"03", v_data, "Receive PCS control register write", mdio_if, terminate_loop,
                           1 ms, ERROR, C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_phy_c45_receive_write(5x"03", v_data, "Receive PCS control register write");

mdio_phy_c45_reply_read()

Waits for a clause 45 read frame to the MMD ‘dev_addr’ of this PHY and returns ‘data’ to the STA. MDIO is driven config.output_delay after the rising MDC edge.

The procedure will report alerts for the same conditions as the mdio_phy_c22_reply_read() procedure.

mdio_phy_c45_reply_read(dev_addr, data, msg, mdio_if, terminate_loop, [timeout, [alert_level, [scope, [msg_id_panel, [config]]]]])

Object

Name

Dir.

Type

Description

constant

dev_addr

in

unsigned(4 downto 0)

MMD within this PHY (DEVAD) that the frame must address. A frame to another MMD is alerted (‘alert_level’).

constant

data

in

std_ulogic_vector(15 downto 0)

The data value returned to the STA

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. A started frame is always completed. Default value is C_UNDEFINED_TIME, which uses config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD or wrong opcode. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_phy_c45_reply_read(5x"03", x"2040", "Reply PCS control register", mdio_if, terminate_loop);
mdio_phy_c45_reply_read(5x"03", x"2040", "Reply PCS control register", mdio_if, terminate_loop, 1 ms, ERROR,
                        C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_phy_c45_reply_read(5x"03", x"2040", "Reply PCS control register");

mdio_phy_c45_reply_post_read_increment()

Waits for a clause 45 post-read-increment-address frame to the MMD ‘dev_addr’ of this PHY and returns ‘data’ to the STA. The BFM does not increment any address.

The procedure will report alerts for the same conditions as the mdio_phy_c22_reply_read() procedure.

mdio_phy_c45_reply_post_read_increment(dev_addr, data, msg, mdio_if, terminate_loop, [timeout, [alert_level, [scope, [msg_id_panel, [config]]]]])

Object

Name

Dir.

Type

Description

constant

dev_addr

in

unsigned(4 downto 0)

MMD within this PHY (DEVAD) that the frame must address. A frame to another MMD is alerted (‘alert_level’).

constant

data

in

std_ulogic_vector(15 downto 0)

The data value returned to the STA.

constant

msg

in

string

A custom message to be appended in the log/alert

signal

mdio_if

inout

t_mdio_if

MDIO signal interface record

signal

terminate_loop

in

std_logic

‘1’ aborts the call and releases the bus, without an alert. Tie to ‘0’ if not used.

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. A started frame is always completed. Default value is C_UNDEFINED_TIME, which uses config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD or wrong opcode. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_phy_c45_reply_post_read_increment(5x"03", x"2040", "Reply PCS register, increment", mdio_if, terminate_loop);
mdio_phy_c45_reply_post_read_increment(5x"03", x"2040", "Reply PCS register, increment", mdio_if, terminate_loop,
                                       1 ms, ERROR, C_SCOPE, shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

-- Suggested usage (requires local overload, see 'Local BFM overloads' section):
mdio_phy_c45_reply_post_read_increment(5x"03", x"2040", "Reply PCS register, increment");

init_mdio_if_signals()

Initializes the MDIO interface. MDC and MDIO are set to ‘Z’ (released).

t_mdio_if := init_mdio_if_signals
-- Examples:
mdio_if <= init_mdio_if_signals;

mdio_check_bit_timing()

Passive timing check of one bit time, used by the bus timing checker of the VVC (see Bus Timing Checker). It waits for the next rising MDC edge and returns the sampled bit. The caller follows the frames and passes who drives MDIO in this bit time (‘driver’). Only the side of the bus selected with ‘checked_side’ is checked, a violation is reported with ‘alert_level’:

  • STA side (CHECK_STA or CHECK_BOTH):

    • STA_DRIVES: MDIO does not change at the rising MDC edge that starts the bit time (0 ns hold time) or within config.min_hold_time after it, and is stable config.min_setup_time before the next rising edge.

    • STA_RELEASES: hold time only, as nobody drives the next bit.

    • PHY_RELEASES: the next bit, driven by the STA, is stable config.min_setup_time before the next rising edge.

    • The MDC period between two rising and between two falling edges (config.min_mdc_period), the high time (config.min_mdc_high_time) and the low time (config.min_mdc_low_time). This is also checked with NOT_CHECKED.

  • PHY side (CHECK_PHY or CHECK_BOTH):

    • PHY_DRIVES: MDIO has settled at most 300 ns after the rising MDC edge that starts the bit time.

    • PHY_RELEASES: the PHY releases MDIO at most 300 ns after the rising MDC edge of the last data bit of a read.

With NOT_CHECKED (e.g. before the first MDC edge, or in the turnaround and data of a frame with an undefined ST/OP combination) MDIO is not checked.

mdio_check_bit_timing(mdio_if, driver, mdc_edges, sampled, checked_side, [alert_level, [scope, [msg_id_panel, [config]]]])

Object

Name

Dir.

Type

Description

signal

mdio_if

in

t_mdio_if

MDIO signal interface record

constant

driver

in

t_mdio_bit_driver

Who drives MDIO in this bit time: NOT_CHECKED, STA_DRIVES, STA_RELEASES, PHY_DRIVES or PHY_RELEASES

variable

mdc_edges

inout

t_mdio_mdc_edges

MDC edges seen so far, kept by the caller between the calls. Needs no initialisation.

variable

sampled

out

std_ulogic

The MDIO value at the rising MDC edge, not normalized (e.g. ‘H’ stays ‘H’). If MDIO changes in the same time step as the edge, the value before the change.

constant

checked_side

in

t_mdio_timing_check

Side of the bus to check: CHECK_STA (MDC and the bits driven by the STA), CHECK_PHY (the bits driven by a PHY) or CHECK_BOTH. The VVC checks the other side than its own role.

constant

alert_level

in

t_alert_level

Sets the severity for a timing violation. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_BFM_SCOPE (“MDIO BFM”).

constant

msg_id_panel

in

t_msg_id_panel

Controls verbosity within a specified scope. Default value is shared_msg_id_panel. For more information see Scope of Verbosity Control.

constant

config

in

t_mdio_bfm_config

Configuration of BFM behavior and restrictions. Default value is C_MDIO_BFM_CONFIG_DEFAULT.

-- Examples:
mdio_check_bit_timing(mdio_if, STA_DRIVES, v_mdc_edges, v_bit, CHECK_STA);
mdio_check_bit_timing(mdio_if, PHY_DRIVES, v_mdc_edges, v_bit, CHECK_PHY, ERROR, C_SCOPE,
                      shared_msg_id_panel, C_MDIO_BFM_CONFIG_DEFAULT);

Local BFM overloads

A good approach for better readability and maintainability is to make simple, local overloads for the BFM procedures in the TB process. This allows calling the BFM procedures with the key parameters only, e.g.

mdio_sta_c22_write(C_PHY_ADDR, C_REG_CONTROL, x"1340", "Restart autonegotiation");

rather than

mdio_sta_c22_write(C_PHY_ADDR, C_REG_CONTROL, x"1340", "Restart autonegotiation", mdio_if, terminate_loop, C_SCOPE,
                   shared_msg_id_panel, C_MDIO_CONFIG_LOCAL);

By defining the local overload as e.g.

procedure mdio_sta_c22_write(
  constant phy_addr : in unsigned;
  constant reg_addr : in unsigned;
  constant data     : in std_ulogic_vector;
  constant msg      : in string) is
begin
  mdio_sta_c22_write(phy_addr,             -- Keep as is
                     reg_addr,             -- Keep as is
                     data,                 -- Keep as is
                     msg,                  -- Keep as is
                     mdio_if,              -- Signal must be visible in local process scope
                     terminate_loop,       -- Signal must be visible in local process scope
                     C_SCOPE,              -- Use the default
                     shared_msg_id_panel,  -- Use global, shared msg_id_panel
                     C_MDIO_CONFIG_LOCAL); -- Use locally defined configuration or C_MDIO_BFM_CONFIG_DEFAULT
end procedure;

Using a local overload like this also allows the following – if wanted:

  • Have address value as natural – and convert in the overload

  • Set up defaults for constants. May be different for two overloads of the same BFM

  • Apply dedicated message ID panel to allow dedicated verbosity control

Local BFM configuration

The default BFM configuration C_MDIO_BFM_CONFIG_DEFAULT follows IEEE 802.3 and can be used as is. A local configuration is needed to e.g. change the MDC period, the address of the PHY or to suppress the preamble.

Defining a local MDIO BFM configuration:

constant C_MDIO_CONFIG_LOCAL : t_mdio_bfm_config := (
  min_setup_time            => 10 ns,
  min_hold_time             => 10 ns,
  min_mdc_period            => 400 ns,
  min_mdc_high_time         => 160 ns,
  min_mdc_low_time          => 160 ns,
  output_delay              => 150 ns,
  id_for_bfm                => ID_BFM,
  id_for_bfm_wait           => ID_BFM_WAIT,
  suppress_preamble         => false,
  sync_to_frame_start       => true,
  protocol_error_severity   => ERROR,
  undriven_severity         => ERROR,
  bus_contention_severity   => ERROR,
  timing_violation_severity => ERROR,
  phy                       => (phy_address                  => 5x"03",
                                max_wait_mdc_change          => 1 ms,
                                max_wait_mdc_change_severity => FAILURE,
                                timeout                      => 10 ms,
                                timeout_severity             => ERROR),
  sta                       => (mdc_period                     => 1 us,
                                preamble_length                => 32,
                                idle_cycles                    => 1,
                                turnaround_not_driven_severity => ERROR)
);

The local configuration can also be derived from the default, e.g.

variable v_mdio_config : t_mdio_bfm_config := C_MDIO_BFM_CONFIG_DEFAULT;
...
v_mdio_config.sta.mdc_period    := 1 us;
v_mdio_config.phy.phy_address   := 5x"03";
v_mdio_config.suppress_preamble := true;

Compilation

  • This BFM package may only be compiled with VHDL-2008 or newer. It is dependent on the Utility Library, which is only compatible with VHDL-2008 or newer.

  • After UVVM-Util has been compiled, the BFM package can be compiled into any desired library.

  • See Essential Mechanisms - Compile Scripts for information about compile scripts.

Simulator compatibility and setup

Additional Documentation

For additional documentation on the MDIO protocol, please see IEEE Std 802.3, clause 22 (22.2.4 “Management functions”, 22.3.4 “MDIO timing”) and clause 45 (“Management Data Input/Output (MDIO) Interface”).

Important

  • This BFM implements the MDIO management interface of IEEE 802.3, clause 22 and clause 45, for the STA and the PHY.

  • The BFM is not a complete MDIO protocol checker, only the listed checks are made.

Abbreviations

Abbreviation

Meaning

STA

Station management entity: the bus master, drives MDC and starts every frame

PHY

The addressed target. In clause 45 any port addressed by PRTAD.

MMD

MDIO manageable device: a clause 45 device within a PHY, addressed by DEVAD

PHYAD / PRTAD

5-bit PHY / port address (clause 22 / clause 45), parameter phy_addr

DEVAD

5-bit MMD address (clause 45), parameter dev_addr

REGAD

5-bit register address (clause 22), parameter reg_addr

ST / OP / TA

Start of frame, operation code and turnaround fields of a frame

VVC

  • VVC functionality is implemented in mdio_vvc.vhd

  • For general information see VVC Mechanisms and Features.

  • The generic constant GC_STA_MODE selects the role: in STA mode the VVC drives MDC and the frames (mdio_sta_* methods), in PHY mode it answers frames from a DUT that is the STA (mdio_phy_* methods).

Entity

Generics

Name

Type

Default

Description

GC_INSTANCE_IDX

natural

Instance number to assign the VVC. Maximum value is defined by C_MDIO_VVC_MAX_INSTANCE_NUM in adaptations_pkg.

GC_STA_MODE

boolean

True: STA, false: PHY. No default, every instance states its role.

GC_MDIO_BFM_CONFIG

t_mdio_bfm_config

C_MDIO_BFM_CONFIG_DEFAULT

Configuration for the MDIO BFM

GC_MDIO_PULLUP

boolean

false

True: the VVC drives a weak pull-up (‘H’) on mdio. False: the test harness provides it.

GC_CMD_QUEUE_COUNT_MAX

natural

C_CMD_QUEUE_COUNT_MAX

Absolute maximum number of commands in the VVC command queue

GC_CMD_QUEUE_COUNT_THRESHOLD

natural

C_CMD_QUEUE_COUNT_THRESHOLD

An alert is generated when reaching this threshold

GC_CMD_QUEUE_COUNT_THRESHOLD_SEVERITY

t_alert_level

C_CMD_QUEUE_COUNT_THRESHOLD_SEVERITY

Severity of the above alert

GC_RESULT_QUEUE_COUNT_MAX

natural

C_RESULT_QUEUE_COUNT_MAX

Maximum number of unfetched results

GC_RESULT_QUEUE_COUNT_THRESHOLD

natural

C_RESULT_QUEUE_COUNT_THRESHOLD

An alert is generated when reaching this threshold

GC_RESULT_QUEUE_COUNT_THRESHOLD_SEVERITY

t_alert_level

C_RESULT_QUEUE_COUNT_THRESHOLD_SEVERITY

Severity of the above alert

Signals

Object

Name

Dir.

Type

Description

signal

mdio_vvc_if

inout

t_mdio_if

MDIO signal interface record

A VVC in STA mode drives MDC low from the start of the simulation, a VVC in PHY mode never drives MDC.

Note

MDIO needs a pull-up. Either set the generic GC_MDIO_PULLUP to true, so that the VVC drives a weak pull-up (‘H’) on mdio (in both modes), or provide the pull-up in the test harness, e.g. mdio <= 'H';. It is enough to enable the pull-up on one VVC connected to the bus.

Configuration Record

vvc_config accessible via shared_mdio_vvc_config

Record element

Type

Default

Description

inter_bfm_delay

t_inter_bfm_delay

C_MDIO_INTER_BFM_DELAY_DEFAULT

Delay between BFM accesses (TIME_START2START or TIME_FINISH2START)

cmd_queue_count_max

natural

C_CMD_QUEUE_COUNT_MAX

Unused, use the entity generic

cmd_queue_count_threshold

natural

C_CMD_QUEUE_COUNT_THRESHOLD

Unused, use the entity generic

cmd_queue_count_threshold_severity

t_alert_level

C_CMD_QUEUE_COUNT_THRESHOLD_SEVERITY

Unused, use the entity generic

result_queue_count_max

natural

C_RESULT_QUEUE_COUNT_MAX

Unused, use the entity generic

result_queue_count_threshold

natural

C_RESULT_QUEUE_COUNT_THRESHOLD

Unused, use the entity generic

result_queue_count_threshold_severity

t_alert_level

C_RESULT_QUEUE_COUNT_THRESHOLD_SEVERITY

Unused, use the entity generic

bfm_config

t_mdio_bfm_config

C_MDIO_BFM_CONFIG_DEFAULT

Configuration for the MDIO BFM

msg_id_panel

t_msg_id_panel

C_VVC_MSG_ID_PANEL_DEFAULT

VVC dedicated message ID panel, see Scope of Verbosity Control

unwanted_transaction_checking_enabled

boolean

C_UNWANTED_TRANSACTION_CHECKING_DEFAULT

Enable unwanted transaction checking, see Unwanted Transaction Detection

unwanted_transaction_severity

t_mdio_unwanted_transaction

C_MDIO_UNWANTED_TRANSACTION

Severity of alert to be issued if unwanted transactions are detected on the DUT outputs

bus_timing_checker

t_bus_timing_checker

C_BUS_TIMING_CHECKER_DEFAULT

Fields ‘enable’ (true) and ‘alert_level’ (ERROR), see Bus Timing Checker

The configuration record can be accessed from the Central Testbench Sequencer through the shared variable array, e.g.

shared_mdio_vvc_config(C_VVC_IDX).bfm_config.sta.mdc_period := 1 us;

Status Record

vvc_status accessible via shared_mdio_vvc_status

The current status of the VVC can be retrieved during simulation. This is achieved by reading from the shared variable from the test sequencer. The record contents can be seen below:

Record element

Type

Description

current_cmd_idx

natural

Command index currently running

previous_cmd_idx

natural

Previous command index to run

pending_cmd_cnt

natural

Pending number of commands in the command queue

Methods

  • All VVC procedures are defined in vvc_methods_pkg.vhd (dedicated to this VVC).

  • See Common VVC Methods for procedures which are common to all VVCs.

  • It is also possible to send a multicast to all instances of a VVC with ALL_INSTANCES as parameter for vvc_instance_idx.

  • All parameters in brackets are optional.

  • mdio_sta_* methods can only be used in STA mode, mdio_phy_* methods only in PHY mode. A command for the other role is reported with TB_ERROR and not executed.

  • Address and data parameters are unconstrained and normalized to the widths given by the protocol. A value wider than the protocol width is only accepted if the extra bits are zero.

  • Read and receive methods store the 16-bit result for fetch_result(), or send it to the scoreboard with TO_SB.

  • insert_delay() with a number of clock cycles: STA mode delays that number of bfm_config.sta.mdc_period, PHY mode waits for that number of rising MDC edges on the bus. In PHY mode MDC is driven by the DUT (STA) and usually only runs during frames, so there is no timeout: if the STA stops MDC, the delay only ends with terminate_current_command(). Use insert_delay() with a time if the DUT may stop MDC, and a timeout in await_completion() to detect a stuck VVC.

Note

Some parameters in the VVC procedures are unconstrained for flexibility. However, the maximum sizes of such parameters need to be defined for the VVC framework. For this VVC, the following maximum values can be configured from adaptations_pkg:

C_MDIO_VVC_CMD_STRING_MAX_LENGTH

Maximum msg length

mdio_sta_c22_write()

Adds a clause 22 write command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c22_write() procedure. This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c22_write(VVCT, vvc_instance_idx, phy_addr, reg_addr, data, msg, [scope])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

reg_addr

in

unsigned

Register address (REGAD). Normalized to 5 bits.

constant

data

in

std_ulogic_vector

The data value to be written to the register. Normalized to 16 bits.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c22_write(MDIO_VVCT, 0, 5x"01", 5x"00", x"1340", "Restart autonegotiation");
mdio_sta_c22_write(MDIO_VVCT, 0, 5x"01", 5x"00", x"1340", "Restart autonegotiation", C_SCOPE);

mdio_sta_c22_read()

Adds a clause 22 read command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c22_read() procedure.

The read data will not be returned in this procedure call since it is non-blocking for the sequencer/caller, but the read data will be stored in the VVC for a potential future fetch (see example with fetch_result below). If the data_routing is set to TO_SB, the read data will be sent to the MDIO VVC dedicated scoreboard where it will be checked against the expected value (provided by the testbench). This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c22_read(VVCT, vvc_instance_idx, phy_addr, reg_addr, [data_routing,] msg, [scope])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

reg_addr

in

unsigned

Register address (REGAD). Normalized to 5 bits.

constant

data_routing

in

t_data_routing

Selects the destination of the received data. TO_SB sends it to the VVC scoreboard instead of the result queue.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c22_read(MDIO_VVCT, 0, 5x"01", 5x"01", "Read status register");
mdio_sta_c22_read(MDIO_VVCT, 0, 5x"01", 5x"01", TO_SB, "Read status register and send to Scoreboard", C_SCOPE);

-- Example with fetch_result() call: Result is placed in v_result
variable v_cmd_idx : natural;                       -- Command index for the last read
variable v_result  : work.vvc_cmd_pkg.t_vvc_result; -- Result from read
...
mdio_sta_c22_read(MDIO_VVCT, 0, 5x"01", 5x"01", "Read status register");
v_cmd_idx := get_last_received_cmd_idx(MDIO_VVCT, 0);
await_completion(MDIO_VVCT, 0, v_cmd_idx, 1 ms, "Wait for read to finish");
fetch_result(MDIO_VVCT, 0, v_cmd_idx, v_result, "Fetching result from read operation");

Hint

t_vvc_result is defined in the corresponding vvc_cmd_pkg.vhd for the VIP.

mdio_sta_c22_check()

Adds a clause 22 check command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c22_check() procedure. The mdio_sta_c22_check() procedure will perform a read operation, then check if the read data is equal to the expected data in the data_exp parameter. If the read data is not equal to the expected data parameter, an alert with severity ‘alert_level’ will be issued. The read data will not be stored by this procedure. This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c22_check(VVCT, vvc_instance_idx, phy_addr, reg_addr, data_exp, msg, [alert_level, [scope]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

reg_addr

in

unsigned

Register address (REGAD). Normalized to 5 bits.

constant

data_exp

in

std_ulogic_vector

The data value to expect when reading the register. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

alert_level

in

t_alert_level

Sets the severity for the alert if the read data does not match. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c22_check(MDIO_VVCT, 0, 5x"01", 5x"01", x"796D", "Check status register");
mdio_sta_c22_check(MDIO_VVCT, 0, 5x"01", 5x"01", x"796D", "Check status register", WARNING, C_SCOPE);

mdio_sta_c45_address()

Adds a clause 45 address command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c45_address() procedure. This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c45_address(VVCT, vvc_instance_idx, phy_addr, dev_addr, reg_addr, msg, [scope])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

dev_addr

in

unsigned

Address of the target MMD within the PHY (DEVAD). Normalized to 5 bits.

constant

reg_addr

in

unsigned

Register address sent in the address frame. Normalized to 16 bits.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c45_address(MDIO_VVCT, 0, 5x"01", 5x"03", x"0000", "Select PCS control register");
mdio_sta_c45_address(MDIO_VVCT, 0, 5x"01", 5x"03", x"0000", "Select PCS control register", C_SCOPE);

mdio_sta_c45_write()

Adds a clause 45 write command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c45_write() procedure. The frame writes the register address set by a preceding address frame. This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c45_write(VVCT, vvc_instance_idx, phy_addr, dev_addr, data, msg, [scope])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

dev_addr

in

unsigned

Address of the target MMD within the PHY (DEVAD). Normalized to 5 bits.

constant

data

in

std_ulogic_vector

The data value to be written to the register. Normalized to 16 bits.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c45_write(MDIO_VVCT, 0, 5x"01", 5x"03", x"2040", "Write PCS control register");
mdio_sta_c45_write(MDIO_VVCT, 0, 5x"01", 5x"03", x"2040", "Write PCS control register", C_SCOPE);

mdio_sta_c45_read()

Adds a clause 45 read command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c45_read() procedure. The frame reads the register address set by a preceding address frame.

The read data will not be returned in this procedure call since it is non-blocking for the sequencer/caller, but the read data will be stored in the VVC for a potential future fetch (see example with fetch_result below). If the data_routing is set to TO_SB, the read data will be sent to the MDIO VVC dedicated scoreboard where it will be checked against the expected value (provided by the testbench). This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c45_read(VVCT, vvc_instance_idx, phy_addr, dev_addr, [data_routing,] msg, [scope])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

dev_addr

in

unsigned

Address of the target MMD within the PHY (DEVAD). Normalized to 5 bits.

constant

data_routing

in

t_data_routing

Selects the destination of the received data. TO_SB sends it to the VVC scoreboard instead of the result queue.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c45_read(MDIO_VVCT, 0, 5x"01", 5x"03", "Read PCS control register");
mdio_sta_c45_read(MDIO_VVCT, 0, 5x"01", 5x"03", TO_SB, "Read PCS control register and send to Scoreboard", C_SCOPE);

-- Example with fetch_result() call: Result is placed in v_result
variable v_cmd_idx : natural;                       -- Command index for the last read
variable v_result  : work.vvc_cmd_pkg.t_vvc_result; -- Result from read
...
mdio_sta_c45_read(MDIO_VVCT, 0, 5x"01", 5x"03", "Read PCS control register");
v_cmd_idx := get_last_received_cmd_idx(MDIO_VVCT, 0);
await_completion(MDIO_VVCT, 0, v_cmd_idx, 1 ms, "Wait for read to finish");
fetch_result(MDIO_VVCT, 0, v_cmd_idx, v_result, "Fetching result from read operation");

Hint

t_vvc_result is defined in the corresponding vvc_cmd_pkg.vhd for the VIP.

mdio_sta_c45_post_read_increment()

Adds a clause 45 post-read-increment command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c45_post_read_increment() procedure.

The read data will not be returned in this procedure call since it is non-blocking for the sequencer/caller, but the read data will be stored in the VVC for a potential future fetch (see example with fetch_result below). If the data_routing is set to TO_SB, the read data will be sent to the MDIO VVC dedicated scoreboard where it will be checked against the expected value (provided by the testbench). This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c45_post_read_increment(VVCT, vvc_instance_idx, phy_addr, dev_addr, [data_routing,] msg, [scope])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

dev_addr

in

unsigned

Address of the target MMD within the PHY (DEVAD). Normalized to 5 bits.

constant

data_routing

in

t_data_routing

Selects the destination of the received data. TO_SB sends it to the VVC scoreboard instead of the result queue.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c45_post_read_increment(MDIO_VVCT, 0, 5x"01", 5x"03", "Read PCS register, increment");
mdio_sta_c45_post_read_increment(MDIO_VVCT, 0, 5x"01", 5x"03", TO_SB, "Read PCS register, increment", C_SCOPE);

-- Example with fetch_result() call: Result is placed in v_result
variable v_cmd_idx : natural;                       -- Command index for the last read
variable v_result  : work.vvc_cmd_pkg.t_vvc_result; -- Result from read
...
mdio_sta_c45_post_read_increment(MDIO_VVCT, 0, 5x"01", 5x"03", "Read PCS register, increment");
v_cmd_idx := get_last_received_cmd_idx(MDIO_VVCT, 0);
await_completion(MDIO_VVCT, 0, v_cmd_idx, 1 ms, "Wait for read to finish");
fetch_result(MDIO_VVCT, 0, v_cmd_idx, v_result, "Fetching result from read operation");

Hint

t_vvc_result is defined in the corresponding vvc_cmd_pkg.vhd for the VIP.

mdio_sta_c45_check()

Adds a clause 45 check command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c45_check() procedure. The mdio_sta_c45_check() procedure will perform a read operation, then check if the read data is equal to the expected data in the data_exp parameter. If the read data is not equal to the expected data parameter, an alert with severity ‘alert_level’ will be issued. The read data will not be stored by this procedure. This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c45_check(VVCT, vvc_instance_idx, phy_addr, dev_addr, data_exp, msg, [alert_level, [scope]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

dev_addr

in

unsigned

Address of the target MMD within the PHY (DEVAD). Normalized to 5 bits.

constant

data_exp

in

std_ulogic_vector

The data value to expect when reading the register. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

alert_level

in

t_alert_level

Sets the severity for the alert if the read data does not match. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c45_check(MDIO_VVCT, 0, 5x"01", 5x"03", x"2040", "Check PCS control register");
mdio_sta_c45_check(MDIO_VVCT, 0, 5x"01", 5x"03", x"2040", "Check PCS control register", WARNING, C_SCOPE);

mdio_sta_c45_check_post_read_increment()

Adds a clause 45 post-read-increment check command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c45_check_post_read_increment() procedure. The mdio_sta_c45_check_post_read_increment() procedure will perform a read operation, then check if the read data is equal to the expected data in the data_exp parameter. If the read data is not equal to the expected data parameter, an alert with severity ‘alert_level’ will be issued. The read data will not be stored by this procedure. This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c45_check_post_read_increment(VVCT, vvc_instance_idx, phy_addr, dev_addr, data_exp, msg, [alert_level, [scope]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

dev_addr

in

unsigned

Address of the target MMD within the PHY (DEVAD). Normalized to 5 bits.

constant

data_exp

in

std_ulogic_vector

The data value to expect when reading the register. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

alert_level

in

t_alert_level

Sets the severity for the alert if the read data does not match. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c45_check_post_read_increment(MDIO_VVCT, 0, 5x"01", 5x"03", x"2040", "Check PCS register, increment");
mdio_sta_c45_check_post_read_increment(MDIO_VVCT, 0, 5x"01", 5x"03", x"2040", "Check PCS register, increment", WARNING, C_SCOPE);

mdio_sta_c45_write_reg()

Adds a complete clause 45 register write as one command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c45_address() procedure followed by the BFM mdio_sta_c45_write() procedure. If the address frame fails, i.e. it is terminated or a bus check of the frame fails (bfm_config.bus_contention_severity), the access frame is not sent and the command ends. Timing alerts of the configuration (bfm_config.timing_violation_severity) do not stop the access frame. This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c45_write_reg(VVCT, vvc_instance_idx, phy_addr, dev_addr, reg_addr, data, msg, [scope])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

dev_addr

in

unsigned

Address of the target MMD within the PHY (DEVAD). Normalized to 5 bits.

constant

reg_addr

in

unsigned

Register address sent in the address frame. Normalized to 16 bits.

constant

data

in

std_ulogic_vector

The data value to be written to the register. Normalized to 16 bits.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c45_write_reg(MDIO_VVCT, 0, 5x"01", 5x"03", x"0000", x"2040", "Write PCS control register");
mdio_sta_c45_write_reg(MDIO_VVCT, 0, 5x"01", 5x"03", x"0000", x"2040", "Write PCS control register", C_SCOPE);

mdio_sta_c45_read_reg()

Adds a complete clause 45 register read as one command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c45_address() procedure followed by the BFM mdio_sta_c45_read() procedure. If the address frame fails, i.e. it is terminated or a bus check of the frame fails (bfm_config.bus_contention_severity), the access frame is not sent and the command ends: the read returns no data (‘X’). Timing alerts of the configuration (bfm_config.timing_violation_severity) do not stop the access frame.

The read data will not be returned in this procedure call since it is non-blocking for the sequencer/caller, but the read data will be stored in the VVC for a potential future fetch (see example with fetch_result below). If the data_routing is set to TO_SB, the read data will be sent to the MDIO VVC dedicated scoreboard where it will be checked against the expected value (provided by the testbench). This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c45_read_reg(VVCT, vvc_instance_idx, phy_addr, dev_addr, reg_addr, [data_routing,] msg, [scope])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

dev_addr

in

unsigned

Address of the target MMD within the PHY (DEVAD). Normalized to 5 bits.

constant

reg_addr

in

unsigned

Register address sent in the address frame. Normalized to 16 bits.

constant

data_routing

in

t_data_routing

Selects the destination of the received data. TO_SB sends it to the VVC scoreboard instead of the result queue.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c45_read_reg(MDIO_VVCT, 0, 5x"01", 5x"03", x"0001", "Read PCS status register");
mdio_sta_c45_read_reg(MDIO_VVCT, 0, 5x"01", 5x"03", x"0001", TO_SB, "Read PCS status register and send to Scoreboard", C_SCOPE);

-- Example with fetch_result() call: Result is placed in v_result
variable v_cmd_idx : natural;                       -- Command index for the last read
variable v_result  : work.vvc_cmd_pkg.t_vvc_result; -- Result from read
...
mdio_sta_c45_read_reg(MDIO_VVCT, 0, 5x"01", 5x"03", x"0001", "Read PCS status register");
v_cmd_idx := get_last_received_cmd_idx(MDIO_VVCT, 0);
await_completion(MDIO_VVCT, 0, v_cmd_idx, 1 ms, "Wait for read to finish");
fetch_result(MDIO_VVCT, 0, v_cmd_idx, v_result, "Fetching result from read operation");

Hint

t_vvc_result is defined in the corresponding vvc_cmd_pkg.vhd for the VIP.

mdio_sta_c45_check_reg()

Adds a complete clause 45 register check as one command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_sta_c45_address() procedure followed by the BFM mdio_sta_c45_check() procedure. If the address frame fails, i.e. it is terminated or a bus check of the frame fails (bfm_config.bus_contention_severity), the access frame is not sent and the command ends. Timing alerts of the configuration (bfm_config.timing_violation_severity) do not stop the access frame. If the read data is not equal to the expected data parameter, an alert with severity ‘alert_level’ will be issued. This procedure can only be called when the MDIO VVC is instantiated in STA mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘true’.

mdio_sta_c45_check_reg(VVCT, vvc_instance_idx, phy_addr, dev_addr, reg_addr, data_exp, msg, [alert_level, [scope]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

phy_addr

in

unsigned

Address of the target PHY: PHYAD (clause 22) / PRTAD (clause 45). Normalized to 5 bits.

constant

dev_addr

in

unsigned

Address of the target MMD within the PHY (DEVAD). Normalized to 5 bits.

constant

reg_addr

in

unsigned

Register address sent in the address frame. Normalized to 16 bits.

constant

data_exp

in

std_ulogic_vector

The data value to expect when reading the register. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

alert_level

in

t_alert_level

Sets the severity for the alert if the read data does not match. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_sta_c45_check_reg(MDIO_VVCT, 0, 5x"01", 5x"03", x"0001", x"0004", "Check PCS status register");
mdio_sta_c45_check_reg(MDIO_VVCT, 0, 5x"01", 5x"03", x"0001", x"0004", "Check PCS status register", WARNING, C_SCOPE);

mdio_phy_c22_expect_write()

Adds a clause 22 expect write command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_phy_c22_expect_write() procedure. This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c22_expect_write(VVCT, vvc_instance_idx, reg_addr, data, msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

reg_addr

in

unsigned

Register address (REGAD). Normalized to 5 bits.

constant

data

in

std_ulogic_vector

The data value to expect in the write frame. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong opcode, wrong register address or wrong written data. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c22_expect_write(MDIO_VVCT, 1, 5x"00", x"1340", "Expect control register write");
mdio_phy_c22_expect_write(MDIO_VVCT, 1, 5x"00", x"1340", "Expect control register write", 1 ms, ERROR, C_SCOPE);

mdio_phy_c22_receive_write()

Adds a clause 22 receive write command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_phy_c22_receive_write() procedure.

The received data will not be returned in this procedure call since it is non-blocking for the sequencer/caller, but the received data will be stored in the VVC for a potential future fetch (see example with fetch_result below). If the data_routing is set to TO_SB, the received data will be sent to the MDIO VVC dedicated scoreboard where it will be checked against the expected value (provided by the testbench). This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c22_receive_write(VVCT, vvc_instance_idx, reg_addr, [data_routing,] msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

reg_addr

in

unsigned

Register address (REGAD). Normalized to 5 bits.

constant

data_routing

in

t_data_routing

Selects the destination of the received data. TO_SB sends it to the VVC scoreboard instead of the result queue.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong opcode or wrong register address. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c22_receive_write(MDIO_VVCT, 1, 5x"00", "Receive control register write");
mdio_phy_c22_receive_write(MDIO_VVCT, 1, 5x"00", TO_SB, "Receive control register write and send to Scoreboard", 1 ms, ERROR, C_SCOPE);

-- Example with fetch_result() call: Result is placed in v_result
variable v_cmd_idx : natural;                       -- Command index for the last receive
variable v_result  : work.vvc_cmd_pkg.t_vvc_result; -- Result from receive
...
mdio_phy_c22_receive_write(MDIO_VVCT, 1, 5x"00", "Receive control register write");
v_cmd_idx := get_last_received_cmd_idx(MDIO_VVCT, 1);
await_completion(MDIO_VVCT, 1, v_cmd_idx, 1 ms, "Wait for receive to finish");
fetch_result(MDIO_VVCT, 1, v_cmd_idx, v_result, "Fetching result from receive operation");

Hint

t_vvc_result is defined in the corresponding vvc_cmd_pkg.vhd for the VIP.

mdio_phy_c22_reply_read()

Adds a clause 22 reply read command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_phy_c22_reply_read() procedure. This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c22_reply_read(VVCT, vvc_instance_idx, reg_addr, data, msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

reg_addr

in

unsigned

Register address (REGAD). Normalized to 5 bits.

constant

data

in

std_ulogic_vector

The data value returned to the STA. Normalized to 16 bits.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong opcode or wrong register address. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c22_reply_read(MDIO_VVCT, 1, 5x"01", x"796D", "Reply status register");
mdio_phy_c22_reply_read(MDIO_VVCT, 1, 5x"01", x"796D", "Reply status register", 1 ms, ERROR, C_SCOPE);

mdio_phy_c45_expect_address()

Adds a clause 45 expect address command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_phy_c45_expect_address() procedure. This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c45_expect_address(VVCT, vvc_instance_idx, dev_addr, reg_addr, msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

dev_addr

in

unsigned

MMD within this PHY (DEVAD) that the frame must address. Normalized to 5 bits. A frame to another MMD is alerted (‘alert_level’).

constant

reg_addr

in

unsigned

Expected register address in the address frame. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD, wrong opcode or wrong register address in the address frame. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c45_expect_address(MDIO_VVCT, 1, 5x"03", x"0000", "Expect PCS control register address");
mdio_phy_c45_expect_address(MDIO_VVCT, 1, 5x"03", x"0000", "Expect PCS control register address", 1 ms, ERROR, C_SCOPE);

mdio_phy_c45_receive_address()

Adds a clause 45 receive address command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_phy_c45_receive_address() procedure.

The received register address will not be returned in this procedure call since it is non-blocking for the sequencer/caller, but the received register address will be stored in the VVC for a potential future fetch (see example with fetch_result below). If the data_routing is set to TO_SB, the received register address will be sent to the MDIO VVC dedicated scoreboard where it will be checked against the expected value (provided by the testbench). This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c45_receive_address(VVCT, vvc_instance_idx, dev_addr, [data_routing,] msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

dev_addr

in

unsigned

MMD within this PHY (DEVAD) that the frame must address. Normalized to 5 bits. A frame to another MMD is alerted (‘alert_level’).

constant

data_routing

in

t_data_routing

Selects the destination of the received data. TO_SB sends it to the VVC scoreboard instead of the result queue.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD or wrong opcode. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c45_receive_address(MDIO_VVCT, 1, 5x"03", "Receive PCS register address");
mdio_phy_c45_receive_address(MDIO_VVCT, 1, 5x"03", TO_SB, "Receive PCS register address and send to Scoreboard", 1 ms, ERROR, C_SCOPE);

-- Example with fetch_result() call: Result is placed in v_result
variable v_cmd_idx : natural;                       -- Command index for the last receive
variable v_result  : work.vvc_cmd_pkg.t_vvc_result; -- Result from receive
...
mdio_phy_c45_receive_address(MDIO_VVCT, 1, 5x"03", "Receive PCS register address");
v_cmd_idx := get_last_received_cmd_idx(MDIO_VVCT, 1);
await_completion(MDIO_VVCT, 1, v_cmd_idx, 1 ms, "Wait for receive to finish");
fetch_result(MDIO_VVCT, 1, v_cmd_idx, v_result, "Fetching result from receive operation");

Hint

t_vvc_result is defined in the corresponding vvc_cmd_pkg.vhd for the VIP.

mdio_phy_c45_expect_write()

Adds a clause 45 expect write command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_phy_c45_expect_write() procedure. This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c45_expect_write(VVCT, vvc_instance_idx, dev_addr, data, msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

dev_addr

in

unsigned

MMD within this PHY (DEVAD) that the frame must address. Normalized to 5 bits. A frame to another MMD is alerted (‘alert_level’).

constant

data

in

std_ulogic_vector

The data value to expect in the write frame. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD, wrong opcode or wrong written data. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c45_expect_write(MDIO_VVCT, 1, 5x"03", x"2040", "Expect PCS control register write");
mdio_phy_c45_expect_write(MDIO_VVCT, 1, 5x"03", x"2040", "Expect PCS control register write", 1 ms, ERROR, C_SCOPE);

mdio_phy_c45_receive_write()

Adds a clause 45 receive write command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_phy_c45_receive_write() procedure.

The received data will not be returned in this procedure call since it is non-blocking for the sequencer/caller, but the received data will be stored in the VVC for a potential future fetch (see example with fetch_result below). If the data_routing is set to TO_SB, the received data will be sent to the MDIO VVC dedicated scoreboard where it will be checked against the expected value (provided by the testbench). This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c45_receive_write(VVCT, vvc_instance_idx, dev_addr, [data_routing,] msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

dev_addr

in

unsigned

MMD within this PHY (DEVAD) that the frame must address. Normalized to 5 bits. A frame to another MMD is alerted (‘alert_level’).

constant

data_routing

in

t_data_routing

Selects the destination of the received data. TO_SB sends it to the VVC scoreboard instead of the result queue.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD or wrong opcode. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c45_receive_write(MDIO_VVCT, 1, 5x"03", "Receive PCS control register write");
mdio_phy_c45_receive_write(MDIO_VVCT, 1, 5x"03", TO_SB, "Receive PCS control register write and send to Scoreboard", 1 ms, ERROR, C_SCOPE);

-- Example with fetch_result() call: Result is placed in v_result
variable v_cmd_idx : natural;                       -- Command index for the last receive
variable v_result  : work.vvc_cmd_pkg.t_vvc_result; -- Result from receive
...
mdio_phy_c45_receive_write(MDIO_VVCT, 1, 5x"03", "Receive PCS control register write");
v_cmd_idx := get_last_received_cmd_idx(MDIO_VVCT, 1);
await_completion(MDIO_VVCT, 1, v_cmd_idx, 1 ms, "Wait for receive to finish");
fetch_result(MDIO_VVCT, 1, v_cmd_idx, v_result, "Fetching result from receive operation");

Hint

t_vvc_result is defined in the corresponding vvc_cmd_pkg.vhd for the VIP.

mdio_phy_c45_reply_read()

Adds a clause 45 reply read command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_phy_c45_reply_read() procedure. This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c45_reply_read(VVCT, vvc_instance_idx, dev_addr, data, msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

dev_addr

in

unsigned

MMD within this PHY (DEVAD) that the frame must address. Normalized to 5 bits. A frame to another MMD is alerted (‘alert_level’).

constant

data

in

std_ulogic_vector

The data value returned to the STA. Normalized to 16 bits.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD or wrong opcode. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c45_reply_read(MDIO_VVCT, 1, 5x"03", x"2040", "Reply PCS control register");
mdio_phy_c45_reply_read(MDIO_VVCT, 1, 5x"03", x"2040", "Reply PCS control register", 1 ms, ERROR, C_SCOPE);

mdio_phy_c45_reply_post_read_increment()

Adds a clause 45 reply post-read-increment command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. When the command is scheduled to run, the executor calls the BFM mdio_phy_c45_reply_post_read_increment() procedure. This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c45_reply_post_read_increment(VVCT, vvc_instance_idx, dev_addr, data, msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

dev_addr

in

unsigned

MMD within this PHY (DEVAD) that the frame must address. Normalized to 5 bits. A frame to another MMD is alerted (‘alert_level’).

constant

data

in

std_ulogic_vector

The data value returned to the STA. Normalized to 16 bits.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for the addressed frame to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if the addressed frame is not as expected: wrong clause, wrong DEVAD or wrong opcode. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c45_reply_post_read_increment(MDIO_VVCT, 1, 5x"03", x"2040", "Reply PCS register, increment");
mdio_phy_c45_reply_post_read_increment(MDIO_VVCT, 1, 5x"03", x"2040", "Reply PCS register, increment", 1 ms, ERROR, C_SCOPE);

mdio_phy_c45_expect_write_reg()

Adds a clause 45 expect write register command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. The command is a complete register access, the counterpart of the STA’s *_reg commands: when it is scheduled to run, the executor calls the BFM mdio_phy_c45_expect_address() procedure for the address frame, then the BFM mdio_phy_c45_expect_write() procedure for the access frame. The access frame is awaited once an address frame was received, also with a wrong DEVAD or register address (reported, the STA sends the access frame anyway). If no address frame was received (timeout, terminated, wrong clause or opcode), the command ends without waiting for the access frame. This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c45_expect_write_reg(VVCT, vvc_instance_idx, dev_addr, reg_addr, data, msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

dev_addr

in

unsigned

MMD within this PHY (DEVAD) that both frames must address. Normalized to 5 bits. A frame to another MMD is alerted (‘alert_level’).

constant

reg_addr

in

unsigned

Expected register address in the address frame. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

data

in

std_ulogic_vector

The data value to expect in the write frame. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for each of the two frames to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if a frame is not as expected: wrong clause, wrong DEVAD, wrong opcode, wrong register address in the address frame or wrong written data. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c45_expect_write_reg(MDIO_VVCT, 1, 5x"03", x"0000", x"2040", "Expect PCS control register write");
mdio_phy_c45_expect_write_reg(MDIO_VVCT, 1, 5x"03", x"0000", x"2040", "Expect PCS control register write", 1 ms, ERROR, C_SCOPE);

mdio_phy_c45_receive_write_reg()

Adds a clause 45 receive write register command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. The command is a complete register access, the counterpart of the STA’s *_reg commands: when it is scheduled to run, the executor calls the BFM mdio_phy_c45_expect_address() procedure for the address frame, then the BFM mdio_phy_c45_receive_write() procedure for the access frame. The access frame is awaited once an address frame was received, also with a wrong DEVAD or register address (reported, the STA sends the access frame anyway). If no address frame was received (timeout, terminated, wrong clause or opcode), the command ends without waiting for the access frame. This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

The data received in the write frame will not be returned in this procedure call since it is non-blocking for the sequencer/caller, but it will be stored in the VVC for a potential future fetch (see example with fetch_result below). It is all ‘X’ if no write frame was received. If the data_routing is set to TO_SB, the received data will be sent to the MDIO VVC dedicated scoreboard where it will be checked against the expected value (provided by the testbench).

mdio_phy_c45_receive_write_reg(VVCT, vvc_instance_idx, dev_addr, reg_addr, [data_routing,] msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

dev_addr

in

unsigned

MMD within this PHY (DEVAD) that both frames must address. Normalized to 5 bits. A frame to another MMD is alerted (‘alert_level’).

constant

reg_addr

in

unsigned

Expected register address in the address frame. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

data_routing

in

t_data_routing

Selects the destination of the received data. TO_SB sends it to the VVC scoreboard instead of the result queue.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for each of the two frames to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if a frame is not as expected: wrong clause, wrong DEVAD, wrong opcode, wrong register address in the address frame. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c45_receive_write_reg(MDIO_VVCT, 1, 5x"03", x"0000", "Receive PCS control register write");
mdio_phy_c45_receive_write_reg(MDIO_VVCT, 1, 5x"03", x"0000", TO_SB, "Receive PCS control register write and send to Scoreboard", 1 ms, ERROR, C_SCOPE);

-- Example with fetch_result() call: Result is placed in v_result
variable v_cmd_idx : natural;                       -- Command index for the last receive
variable v_result  : work.vvc_cmd_pkg.t_vvc_result; -- Result from receive
...
mdio_phy_c45_receive_write_reg(MDIO_VVCT, 1, 5x"03", x"0000", "Receive PCS control register write");
v_cmd_idx := get_last_received_cmd_idx(MDIO_VVCT, 1);
await_completion(MDIO_VVCT, 1, v_cmd_idx, 1 ms, "Wait for receive to finish");
fetch_result(MDIO_VVCT, 1, v_cmd_idx, v_result, "Fetching result from receive operation");

Hint

t_vvc_result is defined in the corresponding vvc_cmd_pkg.vhd for the VIP.

mdio_phy_c45_reply_read_reg()

Adds a clause 45 reply read register command to the MDIO VVC executor queue, which will run as soon as all preceding commands have completed. The command is a complete register access, the counterpart of the STA’s *_reg commands: when it is scheduled to run, the executor calls the BFM mdio_phy_c45_expect_address() procedure for the address frame, then the BFM mdio_phy_c45_reply_read() procedure for the access frame. The access frame is awaited once an address frame was received, also with a wrong DEVAD or register address (reported, the STA sends the access frame anyway). If no address frame was received (timeout, terminated, wrong clause or opcode), the command ends without waiting for the access frame. This procedure can only be called when the MDIO VVC is instantiated in PHY mode, i.e. setting the VVC entity generic constant ‘GC_STA_MODE’ to ‘false’.

mdio_phy_c45_reply_read_reg(VVCT, vvc_instance_idx, dev_addr, reg_addr, data, msg, [timeout, [alert_level, [scope]]])

Object

Name

Dir.

Type

Description

signal

VVCT

inout

t_vvc_target_record

VVC target type compiled into each VVC in order to differentiate between VVCs

constant

vvc_instance_idx

in

integer

Instance number of the VVC

constant

dev_addr

in

unsigned

MMD within this PHY (DEVAD) that both frames must address. Normalized to 5 bits. A frame to another MMD is alerted (‘alert_level’).

constant

reg_addr

in

unsigned

Expected register address in the address frame. Normalized to 16 bits. A mismatch results in an alert with severity ‘alert_level’.

constant

data

in

std_ulogic_vector

The data value returned to the STA. Normalized to 16 bits.

constant

msg

in

string

A custom message to be appended in the log/alert

constant

timeout

in

time

Maximum time to wait for each of the two frames to start. Default value is C_UNDEFINED_TIME, which uses bfm_config.phy.timeout. 0 ns = no timeout.

constant

alert_level

in

t_alert_level

Severity if a frame is not as expected: wrong clause, wrong DEVAD, wrong opcode, wrong register address in the address frame. Default value is ERROR.

constant

scope

in

string

Describes the scope from which the log/alert originates. Default value is C_VVC_CMD_SCOPE_DEFAULT defined in adaptations_pkg.

-- Examples:
mdio_phy_c45_reply_read_reg(MDIO_VVCT, 1, 5x"03", x"0000", x"2040", "Reply PCS control register");
mdio_phy_c45_reply_read_reg(MDIO_VVCT, 1, 5x"03", x"0000", x"2040", "Reply PCS control register", 1 ms, ERROR, C_SCOPE);

Activity Watchdog

The VVCs support a centralized VVC activity register which the activity watchdog uses to monitor the VVC activities. The VVCs will register their presence to the VVC activity register at start-up, and report when ACTIVE and INACTIVE, using dedicated VVC activity register methods, and trigger the global_trigger_vvc_activity_register signal during simulations. The activity watchdog is continuously monitoring the VVC activity register for VVC inactivity and raises an alert if no VVC activity is registered within the specified timeout period.

Include activity_watchdog(num_exp_vvc, timeout, [alert_level, [msg]]) in the testbench to start using the activity watchdog. Note that setting the exact number of expected VVCs in the VVC activity register can be omitted by setting num_exp_vvc = 0.

More information can be found in Essential Mechanisms - Activity Watchdog.

Transaction Info

This VVC supports transaction info, a UVVM concept for distributing transaction information in a controlled manner within the complete testbench environment. The transaction info may be used in many different ways, but the main purpose is to share information directly from the VVC to a DUT model.

MDIO transaction info record fields. Transaction Type: t_base_transaction (BT) - accessible via shared_mdio_vvc_transaction_info.bt

Info field

Type

Default

Description

operation

t_operation

NO_OPERATION

Current VVC operation, e.g. INSERT_DELAY, STA_C22_READ, PHY_C45_REPLY_READ

data

std_ulogic_vector(15 downto 0)

0x0

Data written / expected, or read / received (on COMPLETED)

dev_addr

unsigned(4 downto 0)

0x0

DEVAD of a clause 45 access

phy_addr

unsigned(4 downto 0)

0x0

PHYAD / PRTAD (STA operations)

reg_addr

unsigned(15 downto 0)

0x0

Register address. PHY_C45_RECEIVE_ADDRESS: the received address (on COMPLETED)

vvc_meta

t_vvc_meta

C_VVC_META_DEFAULT

VVC meta data of the executing VVC command

-> msg

string

“”

Message of executing VVC command

-> cmd_idx

integer

-1

Command index of executing VVC command

transaction_status

t_transaction_status

INACTIVE

Set to INACTIVE, IN_PROGRESS or COMPLETED during a transaction

More information can be found in Essential Mechanisms - Distribution of Transaction Info.

Scoreboard

This VVC has built in Scoreboard functionality where data can be routed by setting the TO_SB parameter in supported method calls, i.e. mdio_sta_c22_read() or mdio_phy_c22_receive_write(). Note that the data is only stored in the scoreboard and not accessible with the fetch_result() method when the TO_SB parameter is applied. The MDIO scoreboard is accessible from the testbench as a shared variable mdio_vvc_sb, located in the vvc_methods_pkg.vhd, e.g.

mdio_vvc_sb.add_expected(C_MDIO_VVC_IDX, pad_mdio_sb(v_expected), "Adding expected");
mdio_sta_c22_read(MDIO_VVCT, C_MDIO_VVC_IDX, 5x"01", 5x"01", TO_SB, "Read status register");
...
mdio_vvc_sb.report_counters(ALL_INSTANCES);

The MDIO scoreboard is per default a 16 bits wide standard logic vector. When sending expected data to the scoreboard, where the data width is smaller than the default scoreboard width, we recommend zero-padding the data with the pad_mdio_sb() function, e.g.

mdio_vvc_sb.add_expected(<MDIO VVC instance number>, pad_mdio_sb(<exp data>));

pad_mdio_sb() is located in vvc_sb_support_pkg, which is not part of the MDIO vvc_context. It must be made visible in the testbench in addition to the context, e.g.

library p2l2_vip_mdio;
context p2l2_vip_mdio.vvc_context;
use p2l2_vip_mdio.vvc_sb_support_pkg.all;

A command that ends without data (terminated, timed out or wrong opcode, all reported by the BFM) sends nothing to the scoreboard and is logged with ID_DATA, the expected entry stays pending.

See the Bitvis VIP Scoreboard for a complete list of available commands and additional information. All of the listed Generic Scoreboard commands are available for the MDIO VVC scoreboard using the mdio_vvc_sb.

Unwanted Transaction Detection

This VVC supports detection of unwanted transactions from the DUT. This mechanism will give an alert if the DUT generates any unexpected bus activity that signals a transaction, e.g. asserting the valid signal. It assures that no data is output from the DUT when it is not expected, i.e. read/receive/check/expect VVC methods are not called. Once the VVC is inactive, it starts to monitor continuously on the DUT outputs. When an unwanted transaction is detected, the VVC issues an alert.

This mechanism can also monitor other signals coming from the DUT and generate alerts if any unexpected activity is detected. You can enable this by configuring the corresponding unwanted_transaction_severity for each signal you want to monitor.

The unwanted transaction detection can be configured from the central testbench sequencer, where the severity of alert can be changed to a different value. To configure this feature in the testbench, e.g.

t_mdio_unwanted_transaction

Record element

Type

Default

mdio

t_alert_level

ERROR

-- Disable unwanted transaction checking
shared_mdio_vvc_config(C_VVC_INDEX).unwanted_transaction_checking_enabled := FALSE;

-- Set severity of alert for the signal
shared_mdio_vvc_config(C_VVC_INDEX).unwanted_transaction_severity.mdio := WARNING;
  • STA mode: any change of mdio while the VVC is inactive is reported, except changes that keep the logic level (e.g. ‘H’ to ‘1’).

  • PHY mode: a valid frame to this PHY address that no PHY command was waiting for is reported. With the default sync_to_frame_start, the same command must be waiting from the first preamble bit to catch the frame. A waiting command takes every valid frame to this PHY address: a frame of the other clause or to another MMD is reported by the command (‘alert_level’), not as an unwanted transaction.

  • Use one PHY VVC per PHY address, also for a PHY with several MMDs: queue the commands for all MMDs on this VVC in the order the STA accesses them.

For MDIO VVC, the unwanted transaction detection is enabled by default with severity ERROR.

More information can be found in Essential Mechanisms - Unwanted Transaction Detection.

Bus Timing Checker

Every VVC runs a bus timing property checker (see Controlling Property Checkers) that follows the frames on the bus and checks every bit time with mdio_check_bit_timing(). Each mode checks the other side of the bus: PHY mode checks MDC and the bits driven by the STA, STA mode checks the bits driven by a PHY. Frames with an undefined ST/OP combination are followed to their end; only MDC is checked in their turnaround and data bits.

The checker is configured with vvc_config.bus_timing_checker and enabled with severity ERROR by default, e.g.

shared_mdio_vvc_config(C_VVC_INDEX).bus_timing_checker.enable      := false;
shared_mdio_vvc_config(C_VVC_INDEX).bus_timing_checker.alert_level := WARNING;

Compilation

The MDIO VVC must be compiled with VHDL-2008 or newer. It is dependent on the following libraries:

  • UVVM Utility Library (UVVM-Util)

  • UVVM VVC Framework

  • Bitvis VIP Scoreboard

  • MDIO BFM

Before compiling the MDIO VVC, assure that uvvm_util, uvvm_vvc_framework and bitvis_vip_scoreboard have been compiled.

See Essential Mechanisms - Compile Scripts for information about compile scripts.

Compile order for the MDIO VVC

Compile to library

File

Comment

p2l2_vip_mdio

mdio_bfm_pkg.vhd

MDIO BFM

p2l2_vip_mdio

transaction_pkg.vhd

MDIO transaction package with DTT types, constants, etc.

p2l2_vip_mdio

vvc_cmd_pkg.vhd

MDIO VVC command types and operations

p2l2_vip_mdio

../uvvm_vvc_framework/src_target_dependent/td_target_support_pkg.vhd

UVVM VVC target support package, compiled into this VVC library

p2l2_vip_mdio

../uvvm_vvc_framework/src_target_dependent/td_vvc_framework_common_methods_pkg.vhd

Common UVVM framework methods compiled into this VVC library

p2l2_vip_mdio

vvc_sb_pkg.vhd

MDIO VVC scoreboard (vvc_sb_pkg) and pad_mdio_sb() (vvc_sb_support_pkg)

p2l2_vip_mdio

vvc_methods_pkg.vhd

MDIO VVC methods

p2l2_vip_mdio

../uvvm_vvc_framework/src_target_dependent/td_queue_pkg.vhd

UVVM queue package for this VVC

p2l2_vip_mdio

../uvvm_vvc_framework/src_target_dependent/td_vvc_entity_support_pkg.vhd

UVVM VVC entity support compiled into this VVC library

p2l2_vip_mdio

mdio_vvc.vhd

MDIO VVC

p2l2_vip_mdio

vvc_context.vhd

MDIO VVC context file

Simulator compatibility and setup

Additional Documentation

For additional documentation on the MDIO protocol, please see Additional Documentation.

Important

  • This VIP implements the MDIO management interface of IEEE 802.3, clause 22 and clause 45, for the STA and the PHY.

  • This VIP is not a complete MDIO protocol checker, only the listed checks are made.

Note

Disclaimer: This IP and any part thereof are provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and non-infringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with this IP.