Module ip_mac_host_if

pi_resetlogicpi_sw_resetlogicpi_clocklogicpi_factorlogicpi_base_address[23:0]logicpi_host_sdata[31:0]logicpi_host_sdvalogicpi_host_serrlogicpi_rx_emptylogicpi_rx_last_rdlogicpi_rx_data[31:0]logicpi_rx_soflogicpi_rx_eoflogicpi_rx_errlogicpi_rx_be[1:0]logicpi_tx_fulllogicpi_tx_last_wrlogicpi_tx_upd_emptylogicpi_tx_upd_lastlogicpi_tx_upd_data[9:0]logicpi_regs_csr0_tap[15:0]logicpi_regs_csr0_apelogicpi_regs_csr0_barlogicpi_regs_csr15_swrlogicpi_regs_csr1_tpdlogicpi_regs_csr2_rpdlogicpi_regs_csr3_stl[29:0]logicpi_regs_csr4_srl[29:0]logicpi_regs_csr5_rwtlogicpi_regs_csr15_stlogicpi_regs_csr15_srlogicpi_config_burst_size[5:0]logicpi_config_ds_offset[4:0]logicpi_test_enlogicpi_test_clklogicpi_scan_enlogicpi_scan_inlogicpo_host_mcmdreg[1:0]po_host_maddrreg[31:0]po_host_mdatareg[31:0]po_host_mlastregpo_rx_enable_rdlogicpo_tx_enable_wrlogicpo_tx_datalogic[31:0]po_tx_belogic[1:0]po_tx_soflogicpo_tx_eoflogicpo_tx_put_crclogicpo_tx_put_paddinglogicpo_tx_upd_readlogicpo_regs_csr5_rslogic[1:0]po_regs_csr5_rpslogicpo_regs_csr5_ruregpo_regs_csr5_turegpo_regs_csr5_rilogicpo_regs_csr5_tjtregpo_regs_csr8_mfc_inclogicpo_scan_outlogic

Block Diagram of ip_mac_host_if

Ports

Name

Direction

Type

Description

pi_reset

input

wire logic

Global interface global asynchronous reset

pi_sw_reset

input

wire logic

software reset

pi_clock

input

wire logic

host clock

pi_factor

input

wire logic

host clock enable

pi_base_address

input

wire logic[23:0]

HOST Interface device int mem space base address

po_host_mcmd

output

var reg[1:0]

command

po_host_maddr

output

var reg[31:0]

address

po_host_mdata

output

var reg[31:0]

data to write

po_host_mlast

output

var reg

last word

pi_host_sdata

input

wire logic[31:0]

data to read

pi_host_sdva

input

wire logic

data valid

pi_host_serr

input

wire logic

error during last transaction

po_rx_enable_rd

output

wire logic

RX FIFO interface rx fifo read command

pi_rx_empty

input

wire logic

rx fifo full

pi_rx_last_rd

input

wire logic

rx fifo almost full

pi_rx_data

input

wire logic[31:0]

rx fifo data

pi_rx_sof

input

wire logic

rx fifo eof

pi_rx_eof

input

wire logic

rx fifo eof

pi_rx_err

input

wire logic

rx fifo error

pi_rx_be

input

wire logic[1:0]

rx fifo data byte enable

po_tx_enable_wr

output

wire logic

rx fifo read command

pi_tx_full

input

wire logic

rx fifo full

pi_tx_last_wr

input

wire logic

rx fifo almost full

po_tx_data

output

wire logic[31:0]

rx fifo data

po_tx_be

output

wire logic[1:0]

tx fifo data byte enable

po_tx_sof

output

wire logic

tx fifo start of frame

po_tx_eof

output

wire logic

tx fifo end of frame

po_tx_put_crc

output

wire logic

put crc indication (valid only when sof=1)

po_tx_put_padding

output

wire logic

put padding indication (valid only when sof=1)

po_tx_upd_read

output

wire logic

TX update fifo interface

pi_tx_upd_empty

input

wire logic

pi_tx_upd_last

input

wire logic

pi_tx_upd_data

input

wire logic[9:0]

pi_regs_csr0_tap

input

wire logic[15:0]

Registers bank interface tx automatic polling period CSR0[31:16]

pi_regs_csr0_ape

input

wire logic

tx auto polling enable CSR[15]

pi_regs_csr0_bar

input

wire logic

bus arbitration

pi_regs_csr15_swr

input

wire logic

software reset

pi_regs_csr1_tpd

input

wire logic

transmit poll demand

pi_regs_csr2_rpd

input

wire logic

receive poll demand

pi_regs_csr3_stl

input

wire logic[29:0]

transmit descriptor base address

pi_regs_csr4_srl

input

wire logic[29:0]

receive descriptor base address

po_regs_csr5_rs

output

wire logic[1:0]

receive process state

pi_regs_csr5_rwt

input

wire logic

receive watchdog timeout

po_regs_csr5_rps

output

wire logic

receive process stopped

po_regs_csr5_ru

output

var reg

receive buffer unavailable

po_regs_csr5_tu

output

var reg

transmit buffer unavailable

po_regs_csr5_ri

output

wire logic

receive interupt

po_regs_csr5_tjt

output

var reg

signals Transmit jabber timeout error to the CSR5 register; this will signal to the HOST to perform a software reset to the EMAC

pi_regs_csr15_st

input

wire logic

start/stop transmit

pi_regs_csr15_sr

input

wire logic

start / stop receive

po_regs_csr8_mfc_inc

output

wire logic

missed frame counter increment command

pi_config_burst_size

input

wire logic[5:0]

limit for the rx,tx burst transfers

pi_config_ds_offset

input

wire logic[4:0]

pi_rx_mac_ds_poll, //from the RX EMAC part (new frame arrived, or new data arrived) offset to increment the address if a descriptor

pi_test_en

input

wire logic

Test and Scan interface signals
Test enable

pi_test_clk

input

wire logic

Test clock

pi_scan_en

input

wire logic

SCAN chain shift enable

pi_scan_in

input

wire logic

SCAN chain input

po_scan_out

output

wire logic

SCAN chain output

Always Blocks

always @ ( posedge clock or negedge reset )

manages the next descriptor aquire when rx_ds_needed is asserted, asserts rx_ds_req when pi_host_arb_ds_dv is asserted load pi_host_arb_ds_data into current_ds_addr and deasserts po_host_arb_ds_req the one that asserted ds_needed waits for pi_host_arb_ds_dv to reset

`RX_DS_IDLE `RX_DS_IDLE = 3'b000 `RX_DS_MAIN `RX_DS_MAIN = 3'b001 `RX_DS_READ `RX_DS_READ = 3'b010 `RX_DS_SUSPEND `RX_DS_SUSPEND = 3'b011 `RX_DS_WAIT `RX_DS_WAIT = 3'b100 DEFAULT default 1 [!(! pi_regs_csr15_sr)] 2 [(rx_ds_allowed)] 4 [((pi_host_sdva) && !(pi_host_sdata[31]))] 3 [((pi_host_sdva) && (pi_host_sdata[31]))] 6 [(rx_mac_ds_poll || pi_regs_csr2_rpd)] 5 [(rx_valid_ds_read)]
FSM Transitions for rx_ds_state

#

Current State

Next State

Condition

1

`RX_DS_IDLE

`RX_DS_MAIN

[!(! pi_regs_csr15_sr)]

2

`RX_DS_MAIN

`RX_DS_READ

[(rx_ds_allowed)]

3

`RX_DS_READ

`RX_DS_WAIT

[((pi_host_sdva) && (pi_host_sdata[31]))]

4

`RX_DS_READ

`RX_DS_SUSPEND

[((pi_host_sdva) && !(pi_host_sdata[31]))]

5

`RX_DS_WAIT

`RX_DS_MAIN

[(rx_valid_ds_read)]

6

`RX_DS_SUSPEND

`RX_DS_MAIN

[(rx_mac_ds_poll || pi_regs_csr2_rpd)]

always @ ( posedge clock or negedge reset )

`RX_IDLE `RX_IDLE = 3'b000 `RX_READ_DS `RX_READ_DS = 3'b001 `RX_WRITE_PAUSE `RX_WRITE_PAUSE = 3'b010 `RX_WRITE `RX_WRITE = 3'b011 `RX_STAT `RX_STAT = 3'b101 `RX_WRITE_DS `RX_WRITE_DS = 3'b110 DEFAULT default 1 [(rx_allowed)] 2 [((pi_host_sdva) && !(rx_burst_cnt == 0) && !(rx_burst_cnt == 1) && (rx_burst_cnt == 2))] 4 [(!(! rx_ds_valid) && !(! pi_rx_empty && ! pi_rx_last_rd && ! rx_req) && (rx_allowed))] 3 [(! rx_ds_valid)] 5 [(!(rx_first_word_in_burst) && !(! pi_host_sdva) && (rx_mlast) && (rx_frame_complete))] 6 [(!(rx_first_word_in_burst) && !(! pi_host_sdva) && (rx_mlast) && !(rx_frame_complete) && (rx_buff_complete) && !(! rx_cur_buff && ! rx_ds1[24] && rx_ds1[21 : 11] != 0))] 7 [(!(rx_first_word_in_burst) && !(! pi_host_sdva) && (rx_mlast) && !(rx_frame_complete) && !(rx_buff_complete) && (rx_burst_complete)), (!(rx_first_word_in_burst) && !(! pi_host_sdva) && (rx_mlast) && !(rx_frame_complete) && !(rx_buff_complete) && !(rx_burst_complete)), (!(rx_first_word_in_burst) && !(! pi_host_sdva) && (rx_mlast) && !(rx_frame_complete) && (rx_buff_complete) && (! rx_cur_buff && ! rx_ds1[24] && rx_ds1[21 : 11] != 0))] 8 [(! pi_rx_empty)] 9 [(rx_allowed && pi_host_sdva)]
FSM Transitions for rx_state

#

Current State

Next State

Condition

1

`RX_IDLE

`RX_READ_DS

[(rx_allowed)]

2

`RX_READ_DS

`RX_WRITE_PAUSE

[((pi_host_sdva) && !(rx_burst_cnt == 0) && !(rx_burst_cnt == 1) && (rx_burst_cnt == 2))]

3

`RX_WRITE_PAUSE

`RX_IDLE

[(! rx_ds_valid)]

4

`RX_WRITE_PAUSE

`RX_WRITE

[(!(! rx_ds_valid) && !(! pi_rx_empty && ! pi_rx_last_rd && ! rx_req) && (rx_allowed))]

5

`RX_WRITE

`RX_STAT

[(!(rx_first_word_in_burst) && !(! pi_host_sdva) && (rx_mlast) && (rx_frame_complete))]

6

`RX_WRITE

`RX_WRITE_DS

[(!(rx_first_word_in_burst) && !(! pi_host_sdva) && (rx_mlast) && !(rx_frame_complete) && (rx_buff_complete) && !(! rx_cur_buff && ! rx_ds1[24] && rx_ds1[21 : 11] != 0))]

7

`RX_WRITE

`RX_WRITE_PAUSE

[(!(rx_first_word_in_burst) && !(! pi_host_sdva) && (rx_mlast) && !(rx_frame_complete) && !(rx_buff_complete) && (rx_burst_complete)), (!(rx_first_word_in_burst) && !(! pi_host_sdva) && (rx_mlast) && !(rx_frame_complete) && !(rx_buff_complete) && !(rx_burst_complete)), (!(rx_first_word_in_burst) && !(! pi_host_sdva) && (rx_mlast) && !(rx_frame_complete) && (rx_buff_complete) && (! rx_cur_buff && ! rx_ds1[24] && rx_ds1[21 : 11] != 0))]

8

`RX_STAT

`RX_WRITE_DS

[(! pi_rx_empty)]

9

`RX_WRITE_DS

`RX_IDLE

[(rx_allowed && pi_host_sdva)]

always @ ( posedge clock or negedge reset )

manages the next descriptor aquire

`TX_DS_IDLE `TX_DS_IDLE = 3'b000 `TX_DS_MAIN `TX_DS_MAIN = 3'b001 `TX_DS_READ `TX_DS_READ = 3'b010 `TX_DS_SUSPEND `TX_DS_SUSPEND = 3'b011 `TX_DS_WAIT `TX_DS_WAIT = 3'b100 DEFAULT default 1 [!(! pi_regs_csr15_st)] 2 [(tx_ds_allowed)] 4 [((pi_host_sdva) && !(pi_host_sdata[31]))] 3 [((pi_host_sdva) && (pi_host_sdata[31]))] 6 [(pi_regs_csr0_ape && tx_ds_poll_cnt == pi_regs_csr0_tap || pi_regs_csr1_tpd)] 5 [(tx_valid_ds_read)]
FSM Transitions for tx_ds_state

#

Current State

Next State

Condition

1

`TX_DS_IDLE

`TX_DS_MAIN

[!(! pi_regs_csr15_st)]

2

`TX_DS_MAIN

`TX_DS_READ

[(tx_ds_allowed)]

3

`TX_DS_READ

`TX_DS_WAIT

[((pi_host_sdva) && (pi_host_sdata[31]))]

4

`TX_DS_READ

`TX_DS_SUSPEND

[((pi_host_sdva) && !(pi_host_sdata[31]))]

5

`TX_DS_WAIT

`TX_DS_MAIN

[(tx_valid_ds_read)]

6

`TX_DS_SUSPEND

`TX_DS_MAIN

[(pi_regs_csr0_ape && tx_ds_poll_cnt == pi_regs_csr0_tap || pi_regs_csr1_tpd)]

always @ ( posedge clock or negedge reset )

`TX_IDLE `TX_IDLE = 4'b0000 `TX_READ_DS `TX_READ_DS = 4'b0001 `TX_READ_PAUSE `TX_READ_PAUSE = 4'b0010 `TX_READ `TX_READ = 4'b0011 `TX_WRITE_DS `TX_WRITE_DS = 4'b0100 `TX_LW_DS `TX_LW_DS = 4'b0111 `TX_LW_BUFF `TX_LW_BUFF = 4'b1000 `TX_LW_FRM `TX_LW_FRM = 4'b0110 `TX_LW_BURST `TX_LW_BURST = 4'b1001 `TX_UPD_WAIT `TX_UPD_WAIT = 4'b0101 DEFAULT default 1 [(!(! pi_regs_csr15_st) && !(tx_ds_addr_valid && ! pi_tx_full && ! pi_tx_last_wr && ! tx_upd_fifo_full && ! tx_req) && (tx_allowed))] 2 [((pi_host_sdva) && !(tx_burst_cnt == 0) && !(tx_burst_cnt == 1) && (tx_burst_cnt == 2))] 4 [(!(! tx_ds_valid) && !(! pi_tx_full && ! pi_tx_last_wr && ! tx_req) && (tx_allowed))] 3 [(! tx_ds_valid)] 8 [((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16'h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && (tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && !(tx_ds1[30]) && !(pi_tx_last_wr))] 7 [((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16'h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && (tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && !(tx_ds1[30]) && (pi_tx_last_wr))] 9 [((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16'h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && !(tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && (pi_tx_last_wr))] 6 [((pi_host_sdva) && (tx_mlast1) && (tx_word_cnt >= 16'h1000) && !(pi_tx_last_wr)), ((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16'h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && (tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && (tx_ds1[30]) && !(pi_tx_last_wr))] 10 [((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16'h1000) && !(tx_buff_cnt == tx_curr_buff_size - 1) && (tx_burst_cnt == pi_config_burst_size - 1) && !(pi_tx_last_wr)), ((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16'h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && !(tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && !(pi_tx_last_wr))] 5 [((pi_host_sdva) && (tx_mlast1) && (tx_word_cnt >= 16'h1000) && (pi_tx_last_wr)), ((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16'h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && (tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && (tx_ds1[30]) && (pi_tx_last_wr))] 11 [((pi_host_sdva) && !(tx_mlast1) && (pi_tx_last_wr || pi_tx_full)), ((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16'h1000) && !(tx_buff_cnt == tx_curr_buff_size - 1) && (tx_burst_cnt == pi_config_burst_size - 1) && (pi_tx_last_wr))] 14 [(pi_host_sdva)] 13 [!(pi_tx_last_wr)] 15 [!(pi_tx_last_wr)] 12 [!(pi_tx_last_wr)] 16 [!(pi_tx_last_wr)] 17 [EMPTY]
FSM Transitions for tx_state

#

Current State

Next State

Condition

1

`TX_IDLE

`TX_READ_DS

[(!(! pi_regs_csr15_st) && !(tx_ds_addr_valid && ! pi_tx_full && ! pi_tx_last_wr && ! tx_upd_fifo_full && ! tx_req) && (tx_allowed))]

2

`TX_READ_DS

`TX_READ_PAUSE

[((pi_host_sdva) && !(tx_burst_cnt == 0) && !(tx_burst_cnt == 1) && (tx_burst_cnt == 2))]

3

`TX_READ_PAUSE

`TX_IDLE

[(! tx_ds_valid)]

4

`TX_READ_PAUSE

`TX_READ

[(!(! tx_ds_valid) && !(! pi_tx_full && ! pi_tx_last_wr && ! tx_req) && (tx_allowed))]

5

`TX_READ

`TX_LW_FRM

[((pi_host_sdva) && (tx_mlast1) && (tx_word_cnt >= 16’h1000) && (pi_tx_last_wr)), ((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16’h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && (tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && (tx_ds1[30]) && (pi_tx_last_wr))]

6

`TX_READ

`TX_IDLE

[((pi_host_sdva) && (tx_mlast1) && (tx_word_cnt >= 16’h1000) && !(pi_tx_last_wr)), ((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16’h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && (tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && (tx_ds1[30]) && !(pi_tx_last_wr))]

7

`TX_READ

`TX_LW_DS

[((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16’h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && (tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && !(tx_ds1[30]) && (pi_tx_last_wr))]

8

`TX_READ

`TX_WRITE_DS

[((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16’h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && (tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && !(tx_ds1[30]) && !(pi_tx_last_wr))]

9

`TX_READ

`TX_LW_BUFF

[((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16’h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && !(tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && (pi_tx_last_wr))]

10

`TX_READ

`TX_READ_PAUSE

[((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16’h1000) && !(tx_buff_cnt == tx_curr_buff_size - 1) && (tx_burst_cnt == pi_config_burst_size - 1) && !(pi_tx_last_wr)), ((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16’h1000) && (tx_buff_cnt == tx_curr_buff_size - 1) && !(tx_cur_buff || tx_ds1[24] || tx_ds1[21 : 11] == 0) && !(pi_tx_last_wr))]

11

`TX_READ

`TX_LW_BURST

[((pi_host_sdva) && !(tx_mlast1) && (pi_tx_last_wr || pi_tx_full)), ((pi_host_sdva) && (tx_mlast1) && !(tx_word_cnt >= 16’h1000) && !(tx_buff_cnt == tx_curr_buff_size - 1) && (tx_burst_cnt == pi_config_burst_size - 1) && (pi_tx_last_wr))]

12

`TX_LW_FRM

`TX_IDLE

[!(pi_tx_last_wr)]

13

`TX_LW_DS

`TX_WRITE_DS

[!(pi_tx_last_wr)]

14

`TX_WRITE_DS

`TX_IDLE

[(pi_host_sdva)]

15

`TX_LW_BUFF

`TX_READ_PAUSE

[!(pi_tx_last_wr)]

16

`TX_LW_BURST

`TX_READ_PAUSE

[!(pi_tx_last_wr)]

17

default

`TX_IDLE

[EMPTY]

always @ ( posedge clock or negedge reset )

this process reads from both tx_upd_fifo and tx_upd_resp_fifo, constructs TX_RDS0 and assert tx_ds_req to arbiter along with address(tx_upd_fifo) and data (tx_upd_resp_fifo)

`TX_DS_UPD_IDLE `TX_DS_UPD_IDLE = 2'b00 `TX_DS_UPD_WRITE `TX_DS_UPD_WRITE = 2'b01 DEFAULT default 1 [(tx_upd_req && tx_upd_allowed)] 2 [(pi_host_sdva)]
FSM Transitions for tx_upd_state

#

Current State

Next State

Condition

1

`TX_DS_UPD_IDLE

`TX_DS_UPD_WRITE

[(tx_upd_req && tx_upd_allowed)]

2

`TX_DS_UPD_WRITE

`TX_DS_UPD_IDLE

[(pi_host_sdva)]

always @ ( arb_state or rx_allowed or tx_allowed or rx_ds_allowed or tx_ds_allowed or tx_upd_allowed )

arbiter next state calculation

`ARB_RX `ARB_RX = 3'b010 `ARB_TX `ARB_TX = 3'b011 `ARB_RX_DS `ARB_RX_DS = 3'b100 `ARB_TX_DS `ARB_TX_DS = 3'b101 `ARB_TX_UPD `ARB_TX_UPD = 3'b110 `ARB_IDLE `ARB_IDLE = 3'b000 `ARB_S0 `ARB_S0 = 3'b001 DEFAULT default 1 [(arb_enable)]
FSM Transitions for arb_state

#

Current State

Next State

Condition

1

`ARB_IDLE

`ARB_S0

[(arb_enable)]