From e2888796fae6f620e7774d598fe88b8ee48a5884 Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Wed, 9 Nov 2022 07:47:35 -0600 Subject: Fix bus protocol errors in bus master --- rtl/bus_master.sv | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) (limited to 'rtl') diff --git a/rtl/bus_master.sv b/rtl/bus_master.sv index ba6096c..4967d65 100644 --- a/rtl/bus_master.sv +++ b/rtl/bus_master.sv @@ -39,26 +39,25 @@ module bus_master WAIT: ready = !avl_waitrequest; endcase - always_ff @(posedge clk) begin - unique case(state) - IDLE: begin - avl_read <= 0; - avl_write <= 0; - end - - WAIT: - if(!avl_waitrequest) - state <= IDLE; - endcase - - if(!avl_waitrequest && start) begin - avl_address <= {addr, 2'b00}; + always_ff @(posedge clk) + /* P. 16: + * A host must make no assumption about the assertion state of + * waitrequest when the host is idle: waitrequest may be high or + * low, depending on system properties. When waitrequest is asserted, + * host control signals to the agent must remain constant except for + * beginbursttransfer. + */ + if((state == IDLE || !avl_waitrequest) && start) begin + state <= WAIT; avl_read <= ~write; avl_write <= write; + avl_address <= {addr, 2'b00}; avl_writedata <= data_wr; - state <= WAIT; + end else if(state == WAIT && !avl_waitrequest) begin + state <= IDLE; + avl_read <= 0; + avl_write <= 0; end - end initial begin state = IDLE; -- cgit v1.2.3