[edn/rtl] endpoint hold data for async requestors EDN data will hold until the sebsequent request. Waveform documentation has also been updated. Text for the waveform also updated. Commented out text removed for N hold data cycles. Missed a few lines of old code to remove. Signed-off-by: Mark Branstad <mark.branstad@wdc.com>
diff --git a/hw/ip/edn/doc/_index.md b/hw/ip/edn/doc/_index.md index bc79230..741ed7b 100755 --- a/hw/ip/edn/doc/_index.md +++ b/hw/ip/edn/doc/_index.md
@@ -199,18 +199,18 @@ ##### Peripheral Hardware Interface - Req/Ack The following waveform shows an example of how the peripheral hardware interface works. This example shows the case where the boot-time mode in the ENTROPY_SRC block is enabled. +This example also shows the case where the next request will change the prior data by popping the data FIFO. {{< wavejson >}} {signal: [ - {name: 'clk' , wave: 'p...|.........|.......'}, - {name: 'edn_enable' , wave: '01..|.........|.......'}, - {name: 'edn_req' , wave: '0..1|..01.0..1|.....0.'}, - {name: 'edn_ack' , wave: '0...|.10.10...|....10.'}, - {name: 'edn_bus[31:0]' , wave: '0...|.30.30...|....30.', data: ['es0','es1','es2']}, - {name: 'edn_fips' , wave: '0...|....10...|....10.'}, + {name: 'clk' , wave: 'p...|...........|......'}, + {name: 'edn_enable' , wave: '01..|...........|......'}, + {name: 'edn_req' , wave: '0..1|..0..1.0...|1.0...'}, + {name: 'edn_ack' , wave: '0...|.10...10...|.10...'}, + {name: 'edn_bus[31:0]' , wave: '0...|3....3.....|3.....', data: ['es0','es1','es2']}, + {name: 'edn_fips' , wave: '0...|...........|......'}, {}, -]} -{{< /wavejson >}} +]}{{< /wavejson >}} # Programmers Guide
diff --git a/hw/ip/edn/rtl/edn_ack_sm.sv b/hw/ip/edn/rtl/edn_ack_sm.sv index b2d5198..d4151fe 100755 --- a/hw/ip/edn/rtl/edn_ack_sm.sv +++ b/hw/ip/edn/rtl/edn_ack_sm.sv
@@ -15,26 +15,29 @@ output logic fifo_pop_o ); - // Encoding generated with ./sparse-fsm-encode.py -d 3 -m 3 -n 6 -s 4028491767 - // Hamming distance histogram: - // - // 0: -- - // 1: -- - // 2: -- - // 3: |||||||||||||||||||| (33.33%) - // 4: |||||||||||||||||||| (33.33%) - // 5: |||||||||||||||||||| (33.33%) - // 6: -- - // - // Minimum Hamming distance: 3 - // Maximum Hamming distance: 5 - // +// Encoding generated with: +// $ ./sparse-fsm-encode.py -d 3 -m 4 -n 6 \ +// -s 3468982201 --language=sv +// +// Hamming distance histogram: +// +// 0: -- +// 1: -- +// 2: -- +// 3: |||||||||||||||||||| (66.67%) +// 4: ||||| (16.67%) +// 5: -- +// 6: ||||| (16.67%) +// +// Minimum Hamming distance: 3 +// Maximum Hamming distance: 6 +// localparam int StateWidth = 6; typedef enum logic [StateWidth-1:0] { - Idle = 6'b110101, // idle (hamming distance = 3) - AckImmed = 6'b001011, // ack the request immediately - AckWait = 6'b111010 // wait until the fifo has an entry + Idle = 6'b010011, // idle (hamming distance = 3) + DataWait = 6'b001001, // wait for data to return + AckPls = 6'b101100 // signal ack to endpoint TODO: regen states } state_e; state_e state_d, state_q; @@ -63,24 +66,20 @@ Idle: begin if (req_i) begin if (fifo_not_empty_i) begin - state_d = AckImmed; - end else begin - state_d = AckWait; + fifo_pop_o = 1'b1; end + state_d = DataWait; end end - AckImmed: begin - ack_o = 1'b1; - fifo_pop_o = 1'b1; - state_d = Idle; - end - AckWait: begin + DataWait: begin if (fifo_not_empty_i) begin - ack_o = 1'b1; - fifo_pop_o = 1'b1; - state_d = Idle; + state_d = AckPls; end end + AckPls: begin + ack_o = 1'b1; + state_d = Idle; + end default: state_d = Idle; endcase end
diff --git a/hw/ip/edn/rtl/edn_core.sv b/hw/ip/edn/rtl/edn_core.sv index 1f2f112..63c25ab 100644 --- a/hw/ip/edn/rtl/edn_core.sv +++ b/hw/ip/edn/rtl/edn_core.sv
@@ -112,7 +112,6 @@ logic sfifo_gencmd_not_full; logic sfifo_gencmd_not_empty; - // flops logic [31:0] cs_cmd_req_q, cs_cmd_req_d; logic cs_cmd_req_vld_q, cs_cmd_req_vld_d; @@ -513,7 +512,7 @@ // gate returned data assign edn_o[i].edn_ack = packer_ep_ack[i]; - assign edn_o[i].edn_bus = packer_ep_ack[i] ? packer_ep_rdata[i] : '0; + assign edn_o[i].edn_bus = packer_ep_rdata[i]; edn_ack_sm u_edn_ack_sm_ep ( .clk_i (clk_i),