aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rtl/coretest.v785
1 files changed, 539 insertions, 246 deletions
diff --git a/src/rtl/coretest.v b/src/rtl/coretest.v
index c8172a5..0c1a503 100644
--- a/src/rtl/coretest.v
+++ b/src/rtl/coretest.v
@@ -9,7 +9,7 @@
//
//
// Author: Joachim Strombergson
-// Copyright (c) 2014 SUNET
+// Copyright (c) 2014, SUNET
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
@@ -65,6 +65,9 @@ module coretest(
//----------------------------------------------------------------
// Internal constant and parameter definitions.
//----------------------------------------------------------------
+ // Max elements in read and write buffers.
+ parameter BUFFER_MAX = 4'hf;
+
// Command constants.
parameter SOC = 8'h55;
parameter EOC = 8'haa;
@@ -83,14 +86,10 @@ module coretest(
// rx_engine states.
parameter RX_IDLE = 3'h0;
- parameter RX_SYN = 3'h1;
- parameter RX_ACK = 3'h2;
- parameter RX_NSYN = 3'h4;
- parameter RX_PARSE = 3'h5;
- parameter RX_CMD = 3'h6;
- parameter RX_DONE = 3'h7;
+ parameter RX_ACK = 3'h1;
+ parameter RX_NSYN = 3'h2;
- // rx_engine states.
+ // tx_engine states.
parameter TX_IDLE = 3'h0;
parameter TX_SYN = 3'h1;
parameter TX_NOACK = 3'h2;
@@ -100,7 +99,15 @@ module coretest(
// test_engine states.
parameter TEST_IDLE = 8'h00;
- parameter TEST_PARSE_CMD = 8'h10;
+ parameter TEST_GET_CMD = 8'h10;
+ parameter TEST_PARSE_CMD = 8'h11;
+ parameter TEST_GET_ADDR0 = 8'h20;
+ parameter TEST_GET_ADDR1 = 8'h21;
+ parameter TEST_GET_DATA0 = 8'h24;
+ parameter TEST_GET_DATA1 = 8'h25;
+ parameter TEST_GET_DATA2 = 8'h26;
+ parameter TEST_GET_DATA3 = 8'h27;
+ parameter TEST_GET_EOC = 8'h28;
parameter TEST_RST_START = 8'h30;
parameter TEST_RST_WAIT = 8'h31;
parameter TEST_RST_END = 8'h32;
@@ -110,9 +117,10 @@ module coretest(
parameter TEST_WR_START = 8'h60;
parameter TEST_WR_WAIT = 8'h61;
parameter TEST_WR_END = 8'h62;
- parameter TEST_UNKNOWN = 8'h80;
+ parameter TEST_CMD_UNKNOWN = 8'h80;
+ parameter TEST_CMD_ERROR = 8'h81;
parameter TEST_SEND_RESPONSE = 8'hc0;
-
+
//----------------------------------------------------------------
// Registers including update variables and write enable.
@@ -141,10 +149,6 @@ module coretest(
reg core_we_new;
reg core_we_we;
- reg cmd_available_reg;
- reg cmd_available_new;
- reg cmd_available_we;
-
reg send_response_reg;
reg send_response_new;
reg send_response_we;
@@ -154,29 +158,59 @@ module coretest(
reg response_sent_we;
reg [7 : 0] cmd_reg;
- reg [15 : 0] core_address_reg;
- reg [31 : 0] core_write_data_reg;
+ reg [7 : 0] cmd_we;
+
+ reg [7 : 0] core_addr_byte0_reg;
+ reg core_addr_byte0_we;
+ reg [7 : 0] core_addr_byte1_reg;
+ reg core_addr_byte1_we;
+
+ reg [7 : 0] core_wr_data_byte0_reg;
+ reg core_wr_data_byte0_we;
+ reg [7 : 0] core_wr_data_byte1_reg;
+ reg core_wr_data_byte1_we;
+ reg [7 : 0] core_wr_data_byte2_reg;
+ reg core_wr_data_byte2_we;
+ reg [7 : 0] core_wr_data_byte3_reg;
+ reg core_wr_data_byte3_we;
+
reg [31 : 0] core_read_data_reg;
reg core_error_reg;
reg sample_core_output;
+
+ reg [3 : 0] rx_buffer_rd_ptr_reg;
+ reg [3 : 0] rx_buffer_rd_ptr_new;
+ reg rx_buffer_rd_ptr_we;
+ reg rx_buffer_rd_ptr_inc;
+
+ reg [3 : 0] rx_buffer_wr_ptr_reg;
+ reg [3 : 0] rx_buffer_wr_ptr_new;
+ reg rx_buffer_wr_ptr_we;
+ reg rx_buffer_wr_ptr_inc;
+
+ reg [3 : 0] rx_buffer_ctr_reg;
+ reg [3 : 0] rx_buffer_ctr_new;
+ reg rx_buffer_ctr_we;
+ reg rx_buffer_ctr_inc;
+ reg rx_buffer_ctr_dec;
+ reg rx_buffer_full;
+ reg rx_buffer_empty;
- reg [3 : 0] rx_buffer_ptr_reg;
- reg [3 : 0] rx_buffer_ptr_new;
- reg rx_buffer_ptr_we;
- reg rx_buffer_ptr_rst;
- reg rx_buffer_ptr_inc;
+ reg [7 : 0] rx_buffer [0 : 15];
+ reg rx_buffer_we;
reg [3 : 0] tx_buffer_ptr_reg;
reg [3 : 0] tx_buffer_ptr_new;
reg tx_buffer_ptr_we;
- reg tx_buffer_ptr_rst;
reg tx_buffer_ptr_inc;
-
- reg [7 : 0] rx_buffer [0 : 8];
- reg rx_buffer_we;
+ reg tx_buffer_ptr_rst;
reg [7 : 0] tx_buffer [0 : 8];
reg tx_buffer_we;
+
+ reg [3 : 0] tx_msg_len_reg;
+ reg [3 : 0] tx_msg_len_new;
+ reg tx_msg_len_we;
reg [2 : 0] rx_engine_reg;
reg [2 : 0] rx_engine_new;
@@ -194,22 +228,20 @@ module coretest(
//----------------------------------------------------------------
// Wires.
//----------------------------------------------------------------
- reg [7 : 0] tx_buffert_muxed0;
- reg [7 : 0] tx_buffert_muxed1;
- reg [7 : 0] tx_buffert_muxed2;
- reg [7 : 0] tx_buffert_muxed3;
- reg [7 : 0] tx_buffert_muxed4;
- reg [7 : 0] tx_buffert_muxed5;
- reg [7 : 0] tx_buffert_muxed6;
- reg [7 : 0] tx_buffert_muxed7;
- reg [7 : 0] tx_buffert_muxed8;
-
- reg extract_cmd_fields;
+ reg [7 : 0] tx_buffer_muxed0;
+ reg [7 : 0] tx_buffer_muxed1;
+ reg [7 : 0] tx_buffer_muxed2;
+ reg [7 : 0] tx_buffer_muxed3;
+ reg [7 : 0] tx_buffer_muxed4;
+ reg [7 : 0] tx_buffer_muxed5;
+ reg [7 : 0] tx_buffer_muxed6;
+ reg [7 : 0] tx_buffer_muxed7;
+ reg [7 : 0] tx_buffer_muxed8;
reg update_tx_buffer;
reg [7 : 0] response_type;
-
- reg cmd_accepted;
+
+ reg [7 : 0] rx_byte;
//----------------------------------------------------------------
@@ -223,8 +255,9 @@ module coretest(
assign core_reset_n = core_reset_n_reg & reset_n;
assign core_cs = core_cs_reg;
assign core_we = core_we_reg;
- assign core_address = core_address_reg;
- assign core_write_data = core_write_data_reg;
+ assign core_address = {core_addr_byte0_reg, core_addr_byte1_reg};
+ assign core_write_data = {core_wr_data_byte0_reg, core_wr_data_byte1_reg,
+ core_wr_data_byte2_reg, core_wr_data_byte3_reg};
//----------------------------------------------------------------
@@ -237,51 +270,65 @@ module coretest(
begin: reg_update
if (!reset_n)
begin
- rx_buffer[0] <= 8'h00;
- rx_buffer[1] <= 8'h00;
- rx_buffer[2] <= 8'h00;
- rx_buffer[3] <= 8'h00;
- rx_buffer[4] <= 8'h00;
- rx_buffer[5] <= 8'h00;
- rx_buffer[6] <= 8'h00;
- rx_buffer[7] <= 8'h00;
- rx_buffer[8] <= 8'h00;
+ rx_buffer[0] <= 8'h00;
+ rx_buffer[1] <= 8'h00;
+ rx_buffer[2] <= 8'h00;
+ rx_buffer[3] <= 8'h00;
+ rx_buffer[4] <= 8'h00;
+ rx_buffer[5] <= 8'h00;
+ rx_buffer[6] <= 8'h00;
+ rx_buffer[7] <= 8'h00;
+ rx_buffer[8] <= 8'h00;
+ rx_buffer[9] <= 8'h00;
+ rx_buffer[10] <= 8'h00;
+ rx_buffer[11] <= 8'h00;
+ rx_buffer[12] <= 8'h00;
+ rx_buffer[13] <= 8'h00;
+ rx_buffer[14] <= 8'h00;
+ rx_buffer[15] <= 8'h00;
- tx_buffer[0] <= 8'h00;
- tx_buffer[1] <= 8'h00;
- tx_buffer[2] <= 8'h00;
- tx_buffer[3] <= 8'h00;
- tx_buffer[4] <= 8'h00;
- tx_buffer[5] <= 8'h00;
- tx_buffer[6] <= 8'h00;
- tx_buffer[7] <= 8'h00;
- tx_buffer[8] <= 8'h00;
-
- rx_syn_reg <= 0;
- rx_ack_reg <= 0;
- tx_ack_reg <= 0;
- tx_syn_reg <= 0;
+ tx_buffer[0] <= 8'h00;
+ tx_buffer[1] <= 8'h00;
+ tx_buffer[2] <= 8'h00;
+ tx_buffer[3] <= 8'h00;
+ tx_buffer[4] <= 8'h00;
+ tx_buffer[5] <= 8'h00;
+ tx_buffer[6] <= 8'h00;
+ tx_buffer[7] <= 8'h00;
+ tx_buffer[8] <= 8'h00;
+
+ rx_syn_reg <= 0;
+ rx_ack_reg <= 0;
+ tx_ack_reg <= 0;
+ tx_syn_reg <= 0;
- rx_buffer_ptr_reg <= 4'h0;
- tx_buffer_ptr_reg <= 4'h0;
+ rx_buffer_rd_ptr_reg <= 4'h0;
+ rx_buffer_wr_ptr_reg <= 4'h0;
+ rx_buffer_ctr_reg <= 4'h0;
+
+ tx_buffer_ptr_reg <= 4'h0;
+ tx_msg_len_reg <= 4'h0;
- send_response_reg <= 0;
- response_sent_reg <= 0;
+ send_response_reg <= 0;
+ response_sent_reg <= 0;
- cmd_reg <= 8'h00;
- cmd_available_reg <= 0;
+ cmd_reg <= 8'h00;
+ core_addr_byte0_reg <= 8'h00;
+ core_addr_byte1_reg <= 8'h00;
+ core_wr_data_byte0_reg <= 8'h00;
+ core_wr_data_byte1_reg <= 8'h00;
+ core_wr_data_byte2_reg <= 8'h00;
+ core_wr_data_byte3_reg <= 8'h00;
- core_reset_n_reg <= 1;
- core_cs_reg <= 0;
- core_we_reg <= 0;
- core_error_reg <= 0;
- core_address_reg <= 16'h0000;
- core_write_data_reg <= 32'h00000000;
- core_read_data_reg <= 32'h00000000;
+ core_reset_n_reg <= 1;
+ core_cs_reg <= 0;
+ core_we_reg <= 0;
+ core_error_reg <= 0;
+ core_read_data_reg <= 32'h00000000;
- rx_engine_reg <= RX_IDLE;
- tx_engine_reg <= TX_IDLE;
- test_engine_reg <= TEST_IDLE;
+ rx_engine_reg <= RX_IDLE;
+ tx_engine_reg <= TX_IDLE;
+ test_engine_reg <= TEST_IDLE;
end
else
begin
@@ -300,43 +347,80 @@ module coretest(
if (rx_buffer_we)
begin
- rx_buffer[rx_buffer_ptr_reg] <= rx_data;
+ rx_buffer[rx_buffer_wr_ptr_reg] <= rx_data;
end
if (tx_buffer_we)
begin
- tx_buffer[0] <= tx_buffert_muxed0;
- tx_buffer[1] <= tx_buffert_muxed1;
- tx_buffer[2] <= tx_buffert_muxed2;
- tx_buffer[3] <= tx_buffert_muxed3;
- tx_buffer[4] <= tx_buffert_muxed4;
- tx_buffer[5] <= tx_buffert_muxed5;
- tx_buffer[6] <= tx_buffert_muxed6;
- tx_buffer[7] <= tx_buffert_muxed7;
- tx_buffer[8] <= tx_buffert_muxed8;
+ tx_buffer[0] <= tx_buffer_muxed0;
+ tx_buffer[1] <= tx_buffer_muxed1;
+ tx_buffer[2] <= tx_buffer_muxed2;
+ tx_buffer[3] <= tx_buffer_muxed3;
+ tx_buffer[4] <= tx_buffer_muxed4;
+ tx_buffer[5] <= tx_buffer_muxed5;
+ tx_buffer[6] <= tx_buffer_muxed6;
+ tx_buffer[7] <= tx_buffer_muxed7;
+ tx_buffer[8] <= tx_buffer_muxed8;
end
+
+ if (cmd_we)
+ begin
+ cmd_reg <= rx_byte;
+ end
+
+ if (core_addr_byte0_we)
+ begin
+ core_addr_byte0_reg <= rx_byte;
+ end
+
+ if (core_addr_byte1_we)
+ begin
+ core_addr_byte1_reg <= rx_byte;
+ end
+
+ if (core_wr_data_byte0_we)
+ begin
+ core_wr_data_byte0_reg <= rx_byte;
+ end
+
+ if (core_wr_data_byte1_we)
+ begin
+ core_wr_data_byte1_reg <= rx_byte;
+ end
+
+ if (core_wr_data_byte2_we)
+ begin
+ core_wr_data_byte2_reg <= rx_byte;
+ end
+
+ if (core_wr_data_byte3_we)
+ begin
+ core_wr_data_byte3_reg <= rx_byte;
+ end
- if (rx_buffer_ptr_we)
+ if (rx_buffer_rd_ptr_we)
begin
- rx_buffer_ptr_reg <= rx_buffer_ptr_new;
+ rx_buffer_rd_ptr_reg <= rx_buffer_rd_ptr_new;
end
- if (tx_buffer_ptr_we)
+ if (rx_buffer_wr_ptr_we)
begin
- tx_buffer_ptr_reg <= tx_buffer_ptr_new;
+ rx_buffer_wr_ptr_reg <= rx_buffer_wr_ptr_new;
end
-
- if (extract_cmd_fields)
+
+ if (rx_buffer_ctr_we)
begin
- cmd_reg <= rx_buffer[1];
- core_address_reg <= {rx_buffer[2], rx_buffer[3]};
- core_write_data_reg <= {rx_buffer[4], rx_buffer[5],
- rx_buffer[6], rx_buffer[7]};
+ rx_buffer_ctr_reg <= rx_buffer_ctr_new;
+ end
+
+ if (tx_buffer_ptr_we)
+ begin
+ tx_buffer_ptr_reg <= tx_buffer_ptr_new;
end
- if (cmd_available_we)
+ if (tx_msg_len_we)
begin
- cmd_available_reg <= cmd_available_new;
+ tx_msg_len_reg <= tx_msg_len_new;
end
if (core_reset_n_we)
@@ -387,6 +471,16 @@ module coretest(
end
end // reg_update
+
+ //---------------------------------------------------------------
+ // read_rx_buffer
+ // Combinatinal read mux for the rx_buffer.
+ //---------------------------------------------------------------
+ always @*
+ begin : read_rx_buffer
+ rx_byte = rx_buffer[rx_buffer_rd_ptr_reg];
+ end // read_rx_buffer
+
//---------------------------------------------------------------
// tx_buffer_logic
@@ -398,63 +492,74 @@ module coretest(
always @*
begin: tx_buffer_logic
// Defafult assignments
- tx_buffert_muxed0 = 8'h00;
- tx_buffert_muxed1 = 8'h00;
- tx_buffert_muxed2 = 8'h00;
- tx_buffert_muxed3 = 8'h00;
- tx_buffert_muxed4 = 8'h00;
- tx_buffert_muxed5 = 8'h00;
- tx_buffert_muxed6 = 8'h00;
- tx_buffert_muxed7 = 8'h00;
- tx_buffert_muxed8 = 8'h00;
-
- tx_buffer_we = 0;
+ tx_buffer_muxed0 = 8'h00;
+ tx_buffer_muxed1 = 8'h00;
+ tx_buffer_muxed2 = 8'h00;
+ tx_buffer_muxed3 = 8'h00;
+ tx_buffer_muxed4 = 8'h00;
+ tx_buffer_muxed5 = 8'h00;
+ tx_buffer_muxed6 = 8'h00;
+ tx_buffer_muxed7 = 8'h00;
+ tx_buffer_muxed8 = 8'h00;
+ tx_msg_len_new = 4'h0;
+ tx_msg_len_we = 0;
+ tx_buffer_we = 0;
if (update_tx_buffer)
begin
tx_buffer_we = 1;
- tx_buffert_muxed0 = SOR;
+ tx_buffer_muxed0 = SOR;
case (response_type)
READ_OK:
begin
- tx_buffert_muxed1 = READ_OK;
- tx_buffert_muxed2 = core_address_reg[15 : 8];
- tx_buffert_muxed3 = core_address_reg[7 : 0];
- tx_buffert_muxed4 = core_read_data_reg[31 : 24];
- tx_buffert_muxed5 = core_read_data_reg[23 : 16];
- tx_buffert_muxed6 = core_read_data_reg[15 : 8];
- tx_buffert_muxed7 = core_read_data_reg[7 : 0];
- tx_buffert_muxed8 = EOR;
+ tx_buffer_muxed1 = READ_OK;
+ tx_buffer_muxed2 = core_addr_byte0_reg;
+ tx_buffer_muxed3 = core_addr_byte1_reg;
+ tx_buffer_muxed4 = core_read_data_reg[31 : 24];
+ tx_buffer_muxed5 = core_read_data_reg[23 : 16];
+ tx_buffer_muxed6 = core_read_data_reg[15 : 8];
+ tx_buffer_muxed7 = core_read_data_reg[7 : 0];
+ tx_buffer_muxed8 = EOR;
+ tx_msg_len_new = 4'h8;
+ tx_msg_len_we = 1;
end
WRITE_OK:
begin
- tx_buffert_muxed1 = WRITE_OK;
- tx_buffert_muxed2 = core_address_reg[15 : 8];
- tx_buffert_muxed3 = core_address_reg[7 : 0];
- tx_buffert_muxed4 = EOR;
+ tx_buffer_muxed1 = WRITE_OK;
+ tx_buffer_muxed2 = core_addr_byte0_reg;
+ tx_buffer_muxed3 = core_addr_byte1_reg;
+ tx_buffer_muxed4 = EOR;
+ tx_msg_len_new = 4'h4;
+ tx_msg_len_we = 1;
end
RESET_OK:
begin
- tx_buffert_muxed1 = RESET_OK;
- tx_buffert_muxed2 = EOR;
+ tx_buffer_muxed1 = RESET_OK;
+ tx_buffer_muxed2 = EOR;
+ tx_msg_len_new = 4'h2;
+ tx_msg_len_we = 1;
end
ERROR:
begin
- tx_buffert_muxed1 = ERROR;
- tx_buffert_muxed2 = cmd_reg;
- tx_buffert_muxed3 = EOR;
+ tx_buffer_muxed1 = ERROR;
+ tx_buffer_muxed2 = cmd_reg;
+ tx_buffer_muxed3 = EOR;
+ tx_msg_len_new = 4'h3;
+ tx_msg_len_we = 1;
end
default:
begin
// Any response type not explicitly defined is treated as UNKNOWN.
- tx_buffert_muxed1 = UNKNOWN;
- tx_buffert_muxed2 = cmd_reg;
- tx_buffert_muxed3 = EOR;
+ tx_buffer_muxed1 = UNKNOWN;
+ tx_buffer_muxed2 = cmd_reg;
+ tx_buffer_muxed3 = EOR;
+ tx_msg_len_new = 4'h3;
+ tx_msg_len_we = 1;
end
endcase // case (response_type)
end
@@ -462,32 +567,84 @@ module coretest(
//----------------------------------------------------------------
- // rx_buffer_ptr
+ // rx_buffer_rd_ptr
//
- // Logic for the rx buffer pointer. Supports reset and
- // incremental updates.
+ // Logic for the rx buffer read pointer.
//----------------------------------------------------------------
always @*
- begin: rx_buffer_ptr
+ begin: rx_buffer_rd_ptr
// Default assignments
- rx_buffer_ptr_new = 4'h0;
- rx_buffer_ptr_we = 0;
+ rx_buffer_rd_ptr_new = 4'h0;
+ rx_buffer_rd_ptr_we = 1'b0;
+ rx_buffer_ctr_dec = 0;
- if (rx_buffer_ptr_rst)
+ if (rx_buffer_rd_ptr_inc)
begin
- rx_buffer_ptr_new = 4'h0;
- rx_buffer_ptr_we = 1;
+ rx_buffer_ctr_dec = 1;
+ rx_buffer_rd_ptr_new = rx_buffer_rd_ptr_reg + 1'b1;
+ rx_buffer_rd_ptr_we = 1'b1;
end
+ end // rx_buffer_rd_ptr
+
+
+ //----------------------------------------------------------------
+ // rx_buffer_wr_ptr
+ //
+ // Logic for the rx buffer write pointer.
+ //----------------------------------------------------------------
+ always @*
+ begin: rx_buffer_wr_ptr
+ // Default assignments
+ rx_buffer_wr_ptr_new = 4'h0;
+ rx_buffer_wr_ptr_we = 1'b0;
+ rx_buffer_ctr_inc = 0;
- else if (rx_buffer_ptr_inc)
+ if (rx_buffer_wr_ptr_inc)
begin
- rx_buffer_ptr_new = rx_buffer_ptr_reg + 1'b1;
- rx_buffer_ptr_we = 1;
+ rx_buffer_ctr_inc = 1;
+ rx_buffer_wr_ptr_new = rx_buffer_wr_ptr_reg + 1'b1;
+ rx_buffer_wr_ptr_we = 1'b1;
end
- end // rx_buffer_ptr
+ end // rx_buffer_wr_ptr
//----------------------------------------------------------------
+ // rx_buffer_ctr
+ //
+ // Logic for the rx buffer element counter.
+ //----------------------------------------------------------------
+ always @*
+ begin: rx_buffer_ctr
+ // Default assignments
+ rx_buffer_ctr_new = 4'h0;
+ rx_buffer_ctr_we = 1'b0;
+ rx_buffer_empty = 1'b0;
+ rx_buffer_full = 1'b0;
+
+ if (rx_buffer_ctr_inc)
+ begin
+ rx_buffer_ctr_new = rx_buffer_ctr_reg + 1'b1;
+ rx_buffer_ctr_we = 1'b1;
+ end
+ else if (rx_buffer_ctr_dec)
+ begin
+ rx_buffer_ctr_new = rx_buffer_ctr_reg - 1'b1;
+ rx_buffer_ctr_we = 1'b1;
+ end
+
+ if (rx_buffer_ctr_reg == 4'h0)
+ begin
+ rx_buffer_empty = 1'b1;
+ end
+
+ if (rx_buffer_ctr_reg == BUFFER_MAX)
+ begin
+ rx_buffer_full = 1'b1;
+ end
+ end // rx_buffer_ctr
+
+
+ //----------------------------------------------------------------
// tx_buffer_ptr
//
// Logic for the tx buffer pointer. Supports reset and
@@ -497,18 +654,18 @@ module coretest(
begin: tx_buffer_ptr
// Default assignments
tx_buffer_ptr_new = 4'h0;
- tx_buffer_ptr_we = 0;
+ tx_buffer_ptr_we = 1'b0;
- if (tx_buffer_ptr_rst)
+ if (tx_buffer_ptr_inc)
begin
- tx_buffer_ptr_new = 4'h0;
- tx_buffer_ptr_we = 1;
+ tx_buffer_ptr_new = tx_buffer_ptr_reg + 1'b1;
+ tx_buffer_ptr_we = 1'b1;
end
-
- else if (tx_buffer_ptr_inc)
+
+ else if (tx_buffer_ptr_rst)
begin
- tx_buffer_ptr_new = tx_buffer_ptr_reg + 1'b1;
- tx_buffer_ptr_we = 1;
+ tx_buffer_ptr_new = 4'h0;
+ tx_buffer_ptr_we = 1'b1;
end
end // tx_buffer_ptr
@@ -517,90 +674,55 @@ module coretest(
// rx_engine
//
// FSM responsible for handling receiving message bytes from the
- // host interface and signalling the test engine that there is
- // a new command to be executed.
+ // host interface and storing them in the receive buffer.
//----------------------------------------------------------------
always @*
begin: rx_engine
// Default assignments
- rx_ack_new = 0;
- rx_ack_we = 0;
- rx_buffer_we = 0;
- rx_buffer_ptr_rst = 0;
- rx_buffer_ptr_inc = 0;
- cmd_available_new = 0;
- cmd_available_we = 0;
- rx_engine_new = RX_IDLE;
- rx_engine_we = 0;
+ rx_ack_new = 1'b0;
+ rx_ack_we = 1'b0;
+ rx_buffer_we = 1'b0;
+ rx_buffer_wr_ptr_inc = 1'b0;
+ rx_engine_new = RX_IDLE;
+ rx_engine_we = 1'b0;
case (rx_engine_reg)
RX_IDLE:
begin
if (rx_syn_reg)
begin
- rx_buffer_we = 1;
- rx_engine_new = RX_ACK;
- rx_engine_we = 1;
+ if (!rx_buffer_full)
+ begin
+ rx_buffer_we = 1'b1;
+ rx_engine_new = RX_ACK;
+ rx_engine_we = 1'b1;
+ end
end
end
-
+
RX_ACK:
begin
- rx_ack_new = 1;
- rx_ack_we = 1;
- rx_engine_new = RX_NSYN;
- rx_engine_we = 1;
+ rx_ack_new = 1'b1;
+ rx_ack_we = 1'b1;
+ rx_buffer_wr_ptr_inc = 1'b1;
+ rx_engine_new = RX_NSYN;
+ rx_engine_we = 1'b1;
end
RX_NSYN:
begin
if (!rx_syn_reg)
begin
- rx_engine_new = RX_PARSE;
- rx_engine_we = 1;
- end
- end
-
- RX_PARSE:
- begin
- rx_ack_new = 0;
- rx_ack_we = 1;
- if (rx_buffer[rx_buffer_ptr_reg] == EOC)
- begin
- rx_engine_new = RX_DONE;
+ rx_ack_new = 1'b0;
+ rx_ack_we = 1'b1;
+ rx_engine_new = RX_IDLE;
rx_engine_we = 1;
end
- else
- begin
- rx_buffer_ptr_inc = 1;
- rx_engine_new = RX_IDLE;
- rx_engine_we = 1;
- end
end
- RX_DONE:
- begin
- cmd_available_new = 1;
- cmd_available_we = 1;
- rx_engine_new = RX_CMD;
- rx_engine_we = 1;
- end
-
- RX_CMD:
- if (cmd_accepted)
- begin
- cmd_available_new = 0;
- cmd_available_we = 1;
- rx_buffer_ptr_rst = 1;
- rx_engine_new = RX_IDLE;
- rx_engine_we = 1;
- end
-
default:
begin
- rx_buffer_ptr_rst = 1;
- rx_engine_new = RX_IDLE;
- rx_engine_we = 1;
+
end
endcase // case (rx_engine_reg)
end // rx_engine
@@ -615,8 +737,8 @@ module coretest(
always @*
begin: tx_engine
// Default assignments
- tx_buffer_ptr_rst = 0;
tx_buffer_ptr_inc = 0;
+ tx_buffer_ptr_rst = 0;
response_sent_new = 0;
response_sent_we = 0;
tx_syn_new = 0;
@@ -659,7 +781,7 @@ module coretest(
TX_NEXT:
begin
- if (tx_buffer[tx_buffer_ptr_reg] == EOR)
+ if (tx_buffer_ptr_reg == tx_msg_len_reg)
begin
tx_engine_new = TX_SENT;
tx_engine_we = 1;
@@ -684,9 +806,9 @@ module coretest(
TX_DONE:
begin
- tx_buffer_ptr_rst = 1;
response_sent_new = 0;
response_sent_we = 1;
+ tx_buffer_ptr_rst = 1;
tx_engine_new = TX_IDLE;
tx_engine_we = 1;
end
@@ -710,65 +832,216 @@ module coretest(
always @*
begin: test_engine
// Default assignments.
- core_reset_n_new = 1;
- core_reset_n_we = 0;
- core_cs_new = 0;
- core_cs_we = 0;
- core_we_new = 0;
- core_we_we = 0;
- cmd_accepted = 0;
- extract_cmd_fields = 0;
- sample_core_output = 0;
- update_tx_buffer = 0;
- response_type = 8'h00;
- send_response_new = 0;
- send_response_we = 0;
- test_engine_new = TEST_IDLE;
- test_engine_we = 0;
+ core_reset_n_new = 1;
+ core_reset_n_we = 0;
+ core_cs_new = 0;
+ core_cs_we = 0;
+ core_we_new = 0;
+ core_we_we = 0;
+ sample_core_output = 0;
+ update_tx_buffer = 0;
+ response_type = 8'h00;
+ rx_buffer_rd_ptr_inc = 0;
+ cmd_we = 0;
+ core_addr_byte0_we = 0;
+ core_addr_byte1_we = 0;
+ core_wr_data_byte0_we = 0;
+ core_wr_data_byte1_we = 0;
+ core_wr_data_byte2_we = 0;
+ core_wr_data_byte3_we = 0;
+ send_response_new = 0;
+ send_response_we = 0;
+ test_engine_new = TEST_IDLE;
+ test_engine_we = 0;
+
case (test_engine_reg)
TEST_IDLE:
begin
- if (cmd_available_reg)
+ if (!rx_buffer_empty)
begin
- extract_cmd_fields = 1;
- test_engine_new = TEST_PARSE_CMD;
- test_engine_we = 1;
+ rx_buffer_rd_ptr_inc = 1;
+ if (rx_byte == SOC)
+ begin
+ test_engine_new = TEST_GET_CMD;
+ test_engine_we = 1;
+ end
end
end
- TEST_PARSE_CMD:
+ TEST_GET_CMD:
begin
- cmd_accepted = 1;
+ if (!rx_buffer_empty)
+ begin
+ rx_buffer_rd_ptr_inc = 1;
+ cmd_we = 1;
+ test_engine_new = TEST_PARSE_CMD;
+ test_engine_we = 1;
+ end
+ end
+ TEST_PARSE_CMD:
+ begin
case (cmd_reg)
RESET_CMD:
begin
- test_engine_new = TEST_RST_START;
+ test_engine_new = TEST_GET_EOC;
test_engine_we = 1;
end
READ_CMD:
begin
- test_engine_new = TEST_RD_START;
+ test_engine_new = TEST_GET_ADDR0;
test_engine_we = 1;
end
WRITE_CMD:
begin
- test_engine_new = TEST_WR_START;
+ test_engine_new = TEST_GET_ADDR0;
test_engine_we = 1;
end
default:
begin
- // Unknown command.
- test_engine_new = TEST_UNKNOWN;
+ test_engine_new = TEST_CMD_UNKNOWN;
test_engine_we = 1;
end
endcase // case (cmd_reg)
end
-
+
+
+ TEST_GET_ADDR0:
+ begin
+ if (!rx_buffer_empty)
+ begin
+ rx_buffer_rd_ptr_inc = 1;
+ core_addr_byte0_we = 1;
+ test_engine_new = TEST_GET_ADDR1;
+ test_engine_we = 1;
+ end
+ end
+
+
+ TEST_GET_ADDR1:
+ begin
+ if (!rx_buffer_empty)
+ begin
+ rx_buffer_rd_ptr_inc = 1;
+ core_addr_byte1_we = 1;
+
+ case (cmd_reg)
+ READ_CMD:
+ begin
+ test_engine_new = TEST_GET_EOC;
+ test_engine_we = 1;
+ end
+
+ WRITE_CMD:
+ begin
+ test_engine_new = TEST_GET_DATA0;
+ test_engine_we = 1;
+ end
+
+ default:
+ begin
+ test_engine_new = TEST_CMD_UNKNOWN;
+ test_engine_we = 1;
+ end
+ endcase // case (cmd_reg)
+ end
+ end
+
+
+ TEST_GET_DATA0:
+ begin
+ if (!rx_buffer_empty)
+ begin
+ rx_buffer_rd_ptr_inc = 1;
+ core_wr_data_byte0_we = 1;
+ test_engine_new = TEST_GET_DATA1;
+ test_engine_we = 1;
+ end
+ end
+
+
+ TEST_GET_DATA1:
+ begin
+ if (!rx_buffer_empty)
+ begin
+ rx_buffer_rd_ptr_inc = 1;
+ core_wr_data_byte1_we = 1;
+ test_engine_new = TEST_GET_DATA2;
+ test_engine_we = 1;
+ end
+ end
+
+
+ TEST_GET_DATA2:
+ begin
+ if (!rx_buffer_empty)
+ begin
+ rx_buffer_rd_ptr_inc = 1;
+ core_wr_data_byte2_we = 1;
+ test_engine_new = TEST_GET_DATA3;
+ test_engine_we = 1;
+ end
+ end
+
+
+ TEST_GET_DATA3:
+ begin
+ if (!rx_buffer_empty)
+ begin
+ rx_buffer_rd_ptr_inc = 1;
+ core_wr_data_byte3_we = 1;
+ test_engine_new = TEST_GET_EOC;
+ test_engine_we = 1;
+ end
+ end
+
+
+ TEST_GET_EOC:
+ begin
+ if (!rx_buffer_empty)
+ begin
+ rx_buffer_rd_ptr_inc = 1;
+ if (rx_byte == EOC)
+ begin
+ case (cmd_reg)
+ RESET_CMD:
+ begin
+ test_engine_new = TEST_RST_START;
+ test_engine_we = 1;
+ end
+
+ READ_CMD:
+ begin
+ test_engine_new = TEST_RD_START;
+ test_engine_we = 1;
+ end
+
+ WRITE_CMD:
+ begin
+ test_engine_new = TEST_WR_START;
+ test_engine_we = 1;
+ end
+
+ default:
+ begin
+ test_engine_new = TEST_CMD_UNKNOWN;
+ test_engine_we = 1;
+ end
+ endcase // case (cmd_reg)
+ end
+ else
+ begin
+ test_engine_new = TEST_CMD_ERROR;
+ test_engine_we = 1;
+ end
+ end
+ end
+
+
TEST_RST_START:
begin
core_reset_n_new = 0;
@@ -776,6 +1049,7 @@ module coretest(
test_engine_new = TEST_RST_WAIT;
test_engine_we = 1;
end
+
TEST_RST_WAIT:
begin
@@ -783,6 +1057,7 @@ module coretest(
test_engine_we = 1;
end
+
TEST_RST_END:
begin
core_reset_n_new = 1;
@@ -793,6 +1068,7 @@ module coretest(
test_engine_we = 1;
end
+
TEST_RD_START:
begin
core_cs_new = 1;
@@ -801,6 +1077,7 @@ module coretest(
test_engine_we = 1;
end
+
TEST_RD_WAIT:
begin
sample_core_output = 1;
@@ -808,6 +1085,7 @@ module coretest(
test_engine_we = 1;
end
+
TEST_RD_END:
begin
core_cs_new = 0;
@@ -828,7 +1106,8 @@ module coretest(
test_engine_new = TEST_SEND_RESPONSE;
test_engine_we = 1;
end
-
+
+
TEST_WR_START:
begin
core_cs_new = 1;
@@ -839,7 +1118,8 @@ module coretest(
test_engine_new = TEST_WR_WAIT;
test_engine_we = 1;
end
-
+
+
TEST_WR_WAIT:
begin
sample_core_output = 1;
@@ -847,6 +1127,7 @@ module coretest(
test_engine_we = 1;
end
+
TEST_WR_END:
begin
core_cs_new = 0;
@@ -870,7 +1151,8 @@ module coretest(
test_engine_we = 1;
end
- TEST_UNKNOWN:
+
+ TEST_CMD_UNKNOWN:
begin
update_tx_buffer = 1;
response_type = UNKNOWN;
@@ -878,6 +1160,16 @@ module coretest(
test_engine_we = 1;
end
+
+ TEST_CMD_ERROR:
+ begin
+ update_tx_buffer = 1;
+ response_type = ERROR;
+ test_engine_new = TEST_SEND_RESPONSE;
+ test_engine_we = 1;
+ end
+
+
TEST_SEND_RESPONSE:
begin
send_response_new = 1;
@@ -890,6 +1182,7 @@ module coretest(
test_engine_we = 1;
end
end
+
default:
begin