summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-11-09 07:47:35 -0600
committerAlejandro Soto <alejandro@34project.org>2022-11-09 07:47:51 -0600
commite2888796fae6f620e7774d598fe88b8ee48a5884 (patch)
tree7bd997211462e8a7bfafc65b2d3159547883b52d
parentb6af88a04f281483e8fef961eb4d0b2bf60ee7f0 (diff)
Fix bus protocol errors in bus master
Diffstat (limited to '')
-rw-r--r--rtl/bus_master.sv31
-rw-r--r--tb/sim/hazards.py2
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():