diff options
| -rw-r--r-- | rtl/bus_master.sv | 31 | ||||
| -rw-r--r-- | tb/sim/hazards.py | 2 |
2 files changed, 16 insertions, 17 deletions
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; diff --git a/tb/sim/hazards.py b/tb/sim/hazards.py index b89b15b..8699c47 100644 --- a/tb/sim/hazards.py +++ b/tb/sim/hazards.py @@ -1,6 +1,6 @@ SP = 256 -cycles = 256 +cycles = 1024 mem_dumps = [range(SP - 4, SP)] def final(): |
