rtl:perips:spi: add fifo reset
Signed-off-by: liangkangnan <liangkangnan@163.com>pull/4/head
parent
04d4dd8dfa
commit
b6d3b39f4d
|
@ -59,6 +59,16 @@
|
||||||
name: "SS_DELAY",
|
name: "SS_DELAY",
|
||||||
desc: "SPI ss signal active or inactive how many spi clk",
|
desc: "SPI ss signal active or inactive how many spi clk",
|
||||||
}
|
}
|
||||||
|
{ bits: "16",
|
||||||
|
name: "TX_FIFO_RESET",
|
||||||
|
swaccess: "rw1c",
|
||||||
|
desc: "reset tx fifo",
|
||||||
|
}
|
||||||
|
{ bits: "17",
|
||||||
|
name: "RX_FIFO_RESET",
|
||||||
|
swaccess: "rw1c",
|
||||||
|
desc: "reset rx fifo",
|
||||||
|
}
|
||||||
{ bits: "31:29",
|
{ bits: "31:29",
|
||||||
name: "CLK_DIV",
|
name: "CLK_DIV",
|
||||||
desc: "SPI clock divider count",
|
desc: "SPI clock divider count",
|
||||||
|
@ -99,7 +109,7 @@
|
||||||
hwaccess: "hro",
|
hwaccess: "hro",
|
||||||
hwqe: "true",
|
hwqe: "true",
|
||||||
fields: [
|
fields: [
|
||||||
{ bits: "7:0" }
|
{ bits: "31:0" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
{ name: "RXDATA",
|
{ name: "RXDATA",
|
||||||
|
@ -109,7 +119,7 @@
|
||||||
hwext: "true",
|
hwext: "true",
|
||||||
hwre: "true",
|
hwre: "true",
|
||||||
fields: [
|
fields: [
|
||||||
{ bits: "7:0" }
|
{ bits: "31:0" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -84,12 +84,14 @@ module spi_core #(
|
||||||
logic tx_fifo_push;
|
logic tx_fifo_push;
|
||||||
logic [7:0] tx_fifo_data_out;
|
logic [7:0] tx_fifo_data_out;
|
||||||
logic tx_fifo_pop;
|
logic tx_fifo_pop;
|
||||||
|
logic tx_fifo_flush;
|
||||||
logic rx_fifo_full;
|
logic rx_fifo_full;
|
||||||
logic rx_fifo_empty;
|
logic rx_fifo_empty;
|
||||||
logic [7:0] rx_fifo_data_in;
|
logic [7:0] rx_fifo_data_in;
|
||||||
logic rx_fifo_push;
|
logic rx_fifo_push;
|
||||||
logic [7:0] rx_fifo_data_out;
|
logic [7:0] rx_fifo_data_out;
|
||||||
logic rx_fifo_pop;
|
logic rx_fifo_pop;
|
||||||
|
logic rx_fifo_flush;
|
||||||
|
|
||||||
assign master_enable = ~reg2hw.ctrl0.role_mode.q;
|
assign master_enable = ~reg2hw.ctrl0.role_mode.q;
|
||||||
assign master_start = reg2hw.ctrl0.enable.q && (!tx_fifo_empty);
|
assign master_start = reg2hw.ctrl0.enable.q && (!tx_fifo_empty);
|
||||||
|
@ -103,13 +105,15 @@ module spi_core #(
|
||||||
assign master_ss_level = reg2hw.ctrl0.ss_level.q;
|
assign master_ss_level = reg2hw.ctrl0.ss_level.q;
|
||||||
|
|
||||||
assign tx_fifo_push = reg2hw.txdata.qe;
|
assign tx_fifo_push = reg2hw.txdata.qe;
|
||||||
assign tx_fifo_data_in = reg2hw.txdata.q;
|
assign tx_fifo_data_in = reg2hw.txdata.q[7:0];
|
||||||
assign tx_fifo_pop = master_data_valid_re | master_ready_fe;
|
assign tx_fifo_pop = master_data_valid_re | master_ready_fe;
|
||||||
|
assign tx_fifo_flush = reg2hw.ctrl0.tx_fifo_reset.q && reg2hw.ctrl0.tx_fifo_reset.qe;
|
||||||
// 读操作才把接收到的数据压入RX FIFO
|
// 读操作才把接收到的数据压入RX FIFO
|
||||||
assign rx_fifo_push = master_data_valid_re & master_read;
|
assign rx_fifo_push = master_data_valid_re & master_read;
|
||||||
assign rx_fifo_data_in = master_data_out;
|
assign rx_fifo_data_in = master_data_out;
|
||||||
assign rx_fifo_pop = reg2hw.rxdata.re;
|
assign rx_fifo_pop = reg2hw.rxdata.re;
|
||||||
assign hw2reg.rxdata.d = rx_fifo_data_out;
|
assign hw2reg.rxdata.d = {24'h0, rx_fifo_data_out};
|
||||||
|
assign rx_fifo_flush = reg2hw.ctrl0.rx_fifo_reset.q && reg2hw.ctrl0.rx_fifo_reset.qe;
|
||||||
|
|
||||||
assign hw2reg.status.tx_fifo_full.d = tx_fifo_full;
|
assign hw2reg.status.tx_fifo_full.d = tx_fifo_full;
|
||||||
assign hw2reg.status.tx_fifo_empty.d = tx_fifo_empty;
|
assign hw2reg.status.tx_fifo_empty.d = tx_fifo_empty;
|
||||||
|
@ -164,7 +168,7 @@ module spi_core #(
|
||||||
) u_tx_fifo (
|
) u_tx_fifo (
|
||||||
.clk_i (clk_i),
|
.clk_i (clk_i),
|
||||||
.rst_ni (rst_ni),
|
.rst_ni (rst_ni),
|
||||||
.flush_i (1'b0),
|
.flush_i (tx_fifo_flush),
|
||||||
.testmode_i (1'b0),
|
.testmode_i (1'b0),
|
||||||
.full_o (tx_fifo_full),
|
.full_o (tx_fifo_full),
|
||||||
.empty_o (tx_fifo_empty),
|
.empty_o (tx_fifo_empty),
|
||||||
|
@ -182,7 +186,7 @@ module spi_core #(
|
||||||
) u_rx_fifo (
|
) u_rx_fifo (
|
||||||
.clk_i (clk_i),
|
.clk_i (clk_i),
|
||||||
.rst_ni (rst_ni),
|
.rst_ni (rst_ni),
|
||||||
.flush_i (1'b0),
|
.flush_i (rx_fifo_flush),
|
||||||
.testmode_i (1'b0),
|
.testmode_i (1'b0),
|
||||||
.full_o (rx_fifo_full),
|
.full_o (rx_fifo_full),
|
||||||
.empty_o (rx_fifo_empty),
|
.empty_o (rx_fifo_empty),
|
||||||
|
|
|
@ -58,6 +58,14 @@ package spi_reg_pkg;
|
||||||
logic [3:0] q;
|
logic [3:0] q;
|
||||||
logic qe;
|
logic qe;
|
||||||
} ss_delay;
|
} ss_delay;
|
||||||
|
struct packed {
|
||||||
|
logic q;
|
||||||
|
logic qe;
|
||||||
|
} tx_fifo_reset;
|
||||||
|
struct packed {
|
||||||
|
logic q;
|
||||||
|
logic qe;
|
||||||
|
} rx_fifo_reset;
|
||||||
struct packed {
|
struct packed {
|
||||||
logic [2:0] q;
|
logic [2:0] q;
|
||||||
logic qe;
|
logic qe;
|
||||||
|
@ -83,12 +91,12 @@ package spi_reg_pkg;
|
||||||
} spi_reg2hw_status_reg_t;
|
} spi_reg2hw_status_reg_t;
|
||||||
|
|
||||||
typedef struct packed {
|
typedef struct packed {
|
||||||
logic [7:0] q;
|
logic [31:0] q;
|
||||||
logic qe;
|
logic qe;
|
||||||
} spi_reg2hw_txdata_reg_t;
|
} spi_reg2hw_txdata_reg_t;
|
||||||
|
|
||||||
typedef struct packed {
|
typedef struct packed {
|
||||||
logic [7:0] q;
|
logic [31:0] q;
|
||||||
logic re;
|
logic re;
|
||||||
} spi_reg2hw_rxdata_reg_t;
|
} spi_reg2hw_rxdata_reg_t;
|
||||||
|
|
||||||
|
@ -137,6 +145,14 @@ package spi_reg_pkg;
|
||||||
logic [3:0] d;
|
logic [3:0] d;
|
||||||
logic de;
|
logic de;
|
||||||
} ss_delay;
|
} ss_delay;
|
||||||
|
struct packed {
|
||||||
|
logic d;
|
||||||
|
logic de;
|
||||||
|
} tx_fifo_reset;
|
||||||
|
struct packed {
|
||||||
|
logic d;
|
||||||
|
logic de;
|
||||||
|
} rx_fifo_reset;
|
||||||
struct packed {
|
struct packed {
|
||||||
logic [2:0] d;
|
logic [2:0] d;
|
||||||
logic de;
|
logic de;
|
||||||
|
@ -162,22 +178,22 @@ package spi_reg_pkg;
|
||||||
} spi_hw2reg_status_reg_t;
|
} spi_hw2reg_status_reg_t;
|
||||||
|
|
||||||
typedef struct packed {
|
typedef struct packed {
|
||||||
logic [7:0] d;
|
logic [31:0] d;
|
||||||
} spi_hw2reg_rxdata_reg_t;
|
} spi_hw2reg_rxdata_reg_t;
|
||||||
|
|
||||||
// Register -> HW type
|
// Register -> HW type
|
||||||
typedef struct packed {
|
typedef struct packed {
|
||||||
spi_reg2hw_ctrl0_reg_t ctrl0; // [53:23]
|
spi_reg2hw_ctrl0_reg_t ctrl0; // [105:71]
|
||||||
spi_reg2hw_status_reg_t status; // [22:18]
|
spi_reg2hw_status_reg_t status; // [70:66]
|
||||||
spi_reg2hw_txdata_reg_t txdata; // [17:9]
|
spi_reg2hw_txdata_reg_t txdata; // [65:33]
|
||||||
spi_reg2hw_rxdata_reg_t rxdata; // [8:0]
|
spi_reg2hw_rxdata_reg_t rxdata; // [32:0]
|
||||||
} spi_reg2hw_t;
|
} spi_reg2hw_t;
|
||||||
|
|
||||||
// HW -> register type
|
// HW -> register type
|
||||||
typedef struct packed {
|
typedef struct packed {
|
||||||
spi_hw2reg_ctrl0_reg_t ctrl0; // [43:13]
|
spi_hw2reg_ctrl0_reg_t ctrl0; // [71:37]
|
||||||
spi_hw2reg_status_reg_t status; // [12:8]
|
spi_hw2reg_status_reg_t status; // [36:32]
|
||||||
spi_hw2reg_rxdata_reg_t rxdata; // [7:0]
|
spi_hw2reg_rxdata_reg_t rxdata; // [31:0]
|
||||||
} spi_hw2reg_t;
|
} spi_hw2reg_t;
|
||||||
|
|
||||||
// Register offsets
|
// Register offsets
|
||||||
|
@ -188,7 +204,7 @@ package spi_reg_pkg;
|
||||||
|
|
||||||
// Reset values for hwext registers and their fields
|
// Reset values for hwext registers and their fields
|
||||||
parameter logic [4:0] SPI_STATUS_RESVAL = 5'h0;
|
parameter logic [4:0] SPI_STATUS_RESVAL = 5'h0;
|
||||||
parameter logic [7:0] SPI_RXDATA_RESVAL = 8'h0;
|
parameter logic [31:0] SPI_RXDATA_RESVAL = 32'h0;
|
||||||
|
|
||||||
// Register index
|
// Register index
|
||||||
typedef enum int {
|
typedef enum int {
|
||||||
|
@ -202,8 +218,8 @@ package spi_reg_pkg;
|
||||||
parameter logic [3:0] SPI_PERMIT [4] = '{
|
parameter logic [3:0] SPI_PERMIT [4] = '{
|
||||||
4'b1111, // index[0] SPI_CTRL0
|
4'b1111, // index[0] SPI_CTRL0
|
||||||
4'b0001, // index[1] SPI_STATUS
|
4'b0001, // index[1] SPI_STATUS
|
||||||
4'b0001, // index[2] SPI_TXDATA
|
4'b1111, // index[2] SPI_TXDATA
|
||||||
4'b0001 // index[3] SPI_RXDATA
|
4'b1111 // index[3] SPI_RXDATA
|
||||||
};
|
};
|
||||||
|
|
||||||
endpackage
|
endpackage
|
||||||
|
|
|
@ -61,6 +61,10 @@ module spi_reg_top (
|
||||||
logic ctrl0_ss_level_wd;
|
logic ctrl0_ss_level_wd;
|
||||||
logic [3:0] ctrl0_ss_delay_qs;
|
logic [3:0] ctrl0_ss_delay_qs;
|
||||||
logic [3:0] ctrl0_ss_delay_wd;
|
logic [3:0] ctrl0_ss_delay_wd;
|
||||||
|
logic ctrl0_tx_fifo_reset_qs;
|
||||||
|
logic ctrl0_tx_fifo_reset_wd;
|
||||||
|
logic ctrl0_rx_fifo_reset_qs;
|
||||||
|
logic ctrl0_rx_fifo_reset_wd;
|
||||||
logic [2:0] ctrl0_clk_div_qs;
|
logic [2:0] ctrl0_clk_div_qs;
|
||||||
logic [2:0] ctrl0_clk_div_wd;
|
logic [2:0] ctrl0_clk_div_wd;
|
||||||
logic status_re;
|
logic status_re;
|
||||||
|
@ -70,9 +74,9 @@ module spi_reg_top (
|
||||||
logic status_rx_fifo_empty_qs;
|
logic status_rx_fifo_empty_qs;
|
||||||
logic status_busy_qs;
|
logic status_busy_qs;
|
||||||
logic txdata_we;
|
logic txdata_we;
|
||||||
logic [7:0] txdata_wd;
|
logic [31:0] txdata_wd;
|
||||||
logic rxdata_re;
|
logic rxdata_re;
|
||||||
logic [7:0] rxdata_qs;
|
logic [31:0] rxdata_qs;
|
||||||
|
|
||||||
// Register instances
|
// Register instances
|
||||||
// R[ctrl0]: V(False)
|
// R[ctrl0]: V(False)
|
||||||
|
@ -363,6 +367,58 @@ module spi_reg_top (
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// F[tx_fifo_reset]: 16:16
|
||||||
|
prim_subreg #(
|
||||||
|
.DW (1),
|
||||||
|
.SWACCESS("W1C"),
|
||||||
|
.RESVAL (1'h0)
|
||||||
|
) u_ctrl0_tx_fifo_reset (
|
||||||
|
.clk_i (clk_i),
|
||||||
|
.rst_ni (rst_ni),
|
||||||
|
|
||||||
|
// from register interface
|
||||||
|
.we (ctrl0_we),
|
||||||
|
.wd (ctrl0_tx_fifo_reset_wd),
|
||||||
|
|
||||||
|
// from internal hardware
|
||||||
|
.de (hw2reg.ctrl0.tx_fifo_reset.de),
|
||||||
|
.d (hw2reg.ctrl0.tx_fifo_reset.d),
|
||||||
|
|
||||||
|
// to internal hardware
|
||||||
|
.qe (reg2hw.ctrl0.tx_fifo_reset.qe),
|
||||||
|
.q (reg2hw.ctrl0.tx_fifo_reset.q),
|
||||||
|
|
||||||
|
// to register interface (read)
|
||||||
|
.qs (ctrl0_tx_fifo_reset_qs)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// F[rx_fifo_reset]: 17:17
|
||||||
|
prim_subreg #(
|
||||||
|
.DW (1),
|
||||||
|
.SWACCESS("W1C"),
|
||||||
|
.RESVAL (1'h0)
|
||||||
|
) u_ctrl0_rx_fifo_reset (
|
||||||
|
.clk_i (clk_i),
|
||||||
|
.rst_ni (rst_ni),
|
||||||
|
|
||||||
|
// from register interface
|
||||||
|
.we (ctrl0_we),
|
||||||
|
.wd (ctrl0_rx_fifo_reset_wd),
|
||||||
|
|
||||||
|
// from internal hardware
|
||||||
|
.de (hw2reg.ctrl0.rx_fifo_reset.de),
|
||||||
|
.d (hw2reg.ctrl0.rx_fifo_reset.d),
|
||||||
|
|
||||||
|
// to internal hardware
|
||||||
|
.qe (reg2hw.ctrl0.rx_fifo_reset.qe),
|
||||||
|
.q (reg2hw.ctrl0.rx_fifo_reset.q),
|
||||||
|
|
||||||
|
// to register interface (read)
|
||||||
|
.qs (ctrl0_rx_fifo_reset_qs)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
// F[clk_div]: 31:29
|
// F[clk_div]: 31:29
|
||||||
prim_subreg #(
|
prim_subreg #(
|
||||||
.DW (3),
|
.DW (3),
|
||||||
|
@ -469,9 +525,9 @@ module spi_reg_top (
|
||||||
// R[txdata]: V(False)
|
// R[txdata]: V(False)
|
||||||
|
|
||||||
prim_subreg #(
|
prim_subreg #(
|
||||||
.DW (8),
|
.DW (32),
|
||||||
.SWACCESS("WO"),
|
.SWACCESS("WO"),
|
||||||
.RESVAL (8'h0)
|
.RESVAL (32'h0)
|
||||||
) u_txdata (
|
) u_txdata (
|
||||||
.clk_i (clk_i),
|
.clk_i (clk_i),
|
||||||
.rst_ni (rst_ni),
|
.rst_ni (rst_ni),
|
||||||
|
@ -496,7 +552,7 @@ module spi_reg_top (
|
||||||
// R[rxdata]: V(True)
|
// R[rxdata]: V(True)
|
||||||
|
|
||||||
prim_subreg_ext #(
|
prim_subreg_ext #(
|
||||||
.DW (8)
|
.DW (32)
|
||||||
) u_rxdata (
|
) u_rxdata (
|
||||||
.re (rxdata_re),
|
.re (rxdata_re),
|
||||||
.we (1'b0),
|
.we (1'b0),
|
||||||
|
@ -553,11 +609,15 @@ module spi_reg_top (
|
||||||
|
|
||||||
assign ctrl0_ss_delay_wd = reg_wdata[15:12];
|
assign ctrl0_ss_delay_wd = reg_wdata[15:12];
|
||||||
|
|
||||||
|
assign ctrl0_tx_fifo_reset_wd = reg_wdata[16];
|
||||||
|
|
||||||
|
assign ctrl0_rx_fifo_reset_wd = reg_wdata[17];
|
||||||
|
|
||||||
assign ctrl0_clk_div_wd = reg_wdata[31:29];
|
assign ctrl0_clk_div_wd = reg_wdata[31:29];
|
||||||
assign status_re = addr_hit[1] & reg_re & !reg_error;
|
assign status_re = addr_hit[1] & reg_re & !reg_error;
|
||||||
assign txdata_we = addr_hit[2] & reg_we & !reg_error;
|
assign txdata_we = addr_hit[2] & reg_we & !reg_error;
|
||||||
|
|
||||||
assign txdata_wd = reg_wdata[7:0];
|
assign txdata_wd = reg_wdata[31:0];
|
||||||
assign rxdata_re = addr_hit[3] & reg_re & !reg_error;
|
assign rxdata_re = addr_hit[3] & reg_re & !reg_error;
|
||||||
|
|
||||||
// Read data return
|
// Read data return
|
||||||
|
@ -576,6 +636,8 @@ module spi_reg_top (
|
||||||
reg_rdata_next[10] = ctrl0_ss_sw_ctrl_qs;
|
reg_rdata_next[10] = ctrl0_ss_sw_ctrl_qs;
|
||||||
reg_rdata_next[11] = ctrl0_ss_level_qs;
|
reg_rdata_next[11] = ctrl0_ss_level_qs;
|
||||||
reg_rdata_next[15:12] = ctrl0_ss_delay_qs;
|
reg_rdata_next[15:12] = ctrl0_ss_delay_qs;
|
||||||
|
reg_rdata_next[16] = ctrl0_tx_fifo_reset_qs;
|
||||||
|
reg_rdata_next[17] = ctrl0_rx_fifo_reset_qs;
|
||||||
reg_rdata_next[31:29] = ctrl0_clk_div_qs;
|
reg_rdata_next[31:29] = ctrl0_clk_div_qs;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -588,11 +650,11 @@ module spi_reg_top (
|
||||||
end
|
end
|
||||||
|
|
||||||
addr_hit[2]: begin
|
addr_hit[2]: begin
|
||||||
reg_rdata_next[7:0] = '0;
|
reg_rdata_next[31:0] = '0;
|
||||||
end
|
end
|
||||||
|
|
||||||
addr_hit[3]: begin
|
addr_hit[3]: begin
|
||||||
reg_rdata_next[7:0] = rxdata_qs;
|
reg_rdata_next[31:0] = rxdata_qs;
|
||||||
end
|
end
|
||||||
|
|
||||||
default: begin
|
default: begin
|
||||||
|
|
Loading…
Reference in New Issue