axidebugmaster.v (5298B)
1 /* Copyright 2014 Brian Swetland <swetland@frotz.net> 2 * 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 `timescale 1ns/1ps 17 18 module axidebugmaster #( 19 parameter integer C_M00_AXI_ADDR_WIDTH = 32, 20 parameter integer C_M00_AXI_DATA_WIDTH = 32 21 ) ( 22 input wire m00_axi_aclk, 23 output wire [C_M00_AXI_ADDR_WIDTH-1 : 0] m00_axi_awaddr, 24 output wire m00_axi_awlock, 25 output wire [3 : 0] m00_axi_awcache, 26 output wire [2 : 0] m00_axi_awprot, 27 output reg m00_axi_awvalid, 28 input wire m00_axi_awready, 29 output wire [C_M00_AXI_DATA_WIDTH-1 : 0] m00_axi_wdata, 30 output wire [C_M00_AXI_DATA_WIDTH/8-1 : 0] m00_axi_wstrb, 31 output reg m00_axi_wvalid, 32 input wire m00_axi_wready, 33 input wire [1 : 0] m00_axi_bresp, 34 input wire m00_axi_bvalid, 35 output reg m00_axi_bready, 36 output wire [C_M00_AXI_ADDR_WIDTH-1 : 0] m00_axi_araddr, 37 output wire m00_axi_arlock, 38 output wire [3 : 0] m00_axi_arcache, 39 output wire [2 : 0] m00_axi_arprot, 40 output reg m00_axi_arvalid, 41 input wire m00_axi_arready, 42 input wire [C_M00_AXI_DATA_WIDTH-1 : 0] m00_axi_rdata, 43 input wire [1 : 0] m00_axi_rresp, 44 input wire m00_axi_rvalid, 45 output reg m00_axi_rready 46 ); 47 48 wire clk; 49 assign clk = m00_axi_aclk; 50 51 assign m00_axi_awlock = 0; 52 assign m00_axi_awcache = 0; 53 assign m00_axi_awprot = 0; 54 assign m00_axi_arlock = 0; 55 assign m00_axi_arcache = 0; 56 assign m00_axi_arprot = 0; 57 assign m00_axi_wstrb = 4'b1111; 58 59 reg [31:0]txn_addr; 60 reg [31:0]txn_addr_next; 61 62 reg [31:0]txn_data; 63 reg [31:0]txn_data_next; 64 65 localparam STATE_IDLE = 3'd0; 66 localparam STATE_WADDR = 3'd1; 67 localparam STATE_WDATA = 3'd2; 68 localparam STATE_WACK = 3'd3; 69 localparam STATE_RADDR = 3'd4; 70 localparam STATE_RDATA = 3'd5; 71 72 localparam DBG_IDCODE = 32'h4158494d; 73 74 localparam DBG_R_IDCODE = 3'd0; 75 localparam DBG_R_GETDATA = 3'd1; 76 localparam DBG_R_GETADDR = 3'd2; 77 localparam DBG_R_STATUS = 3'd7; 78 79 localparam DBG_W_SETADDR_READ = 3'd1; 80 localparam DBG_W_SETADDR = 3'd2; 81 localparam DBG_W_SETDATA_WRITE = 3'd3; 82 localparam DBG_W_SETDATA_INCADDR_WRITE = 3'd4; 83 84 reg [2:0]state = STATE_IDLE; 85 reg [2:0]state_next; 86 87 reg txn_done = 0; 88 reg txn_done_next; 89 90 reg awvalid_next; 91 reg wvalid_next; 92 reg bready_next; 93 reg arvalid_next; 94 reg rready_next; 95 96 assign m00_axi_awaddr = txn_addr; 97 assign m00_axi_araddr = txn_addr; 98 assign m00_axi_wdata = txn_data; 99 100 wire dbg_rd, dbg_wr; 101 wire [2:0]dbg_addr; 102 wire [31:0]dbg_wdata; 103 reg [31:0]dbg_rdata; 104 105 always @(posedge clk) begin 106 state <= state_next; 107 txn_addr <= txn_addr_next; 108 txn_data <= txn_data_next; 109 txn_done <= txn_done_next; 110 m00_axi_awvalid = awvalid_next; 111 m00_axi_wvalid = wvalid_next; 112 m00_axi_bready = bready_next; 113 m00_axi_arvalid = arvalid_next; 114 m00_axi_rready = rready_next; 115 end 116 117 always @(*) begin 118 state_next = state; 119 txn_addr_next = txn_addr; 120 txn_data_next = txn_data; 121 txn_done_next = 0; 122 awvalid_next = 0; 123 wvalid_next = 0; 124 bready_next = 0; 125 arvalid_next = 0; 126 rready_next = 0; 127 case (state) 128 STATE_IDLE: begin 129 if (dbg_wr) begin 130 case (dbg_addr) 131 DBG_W_SETADDR: begin 132 txn_addr_next = dbg_wdata; 133 end 134 DBG_W_SETADDR_READ: begin 135 state_next = STATE_RADDR; 136 txn_addr_next = dbg_wdata; 137 arvalid_next = 1; 138 end 139 DBG_W_SETDATA_WRITE: begin 140 state_next = STATE_WADDR; 141 txn_data_next = dbg_wdata; 142 awvalid_next = 1; 143 end 144 DBG_W_SETDATA_INCADDR_WRITE: begin 145 state_next = STATE_WADDR; 146 txn_data_next = dbg_wdata; 147 txn_addr_next = txn_addr + 4; 148 awvalid_next = 1; 149 end 150 default: ; 151 endcase 152 end else begin 153 txn_done_next = 1; 154 end 155 end 156 STATE_WADDR: begin 157 if (m00_axi_awready) begin 158 state_next = STATE_WDATA; 159 wvalid_next = 1; 160 end else begin 161 awvalid_next = 1; 162 end 163 end 164 STATE_WDATA: begin 165 if (m00_axi_wready) begin 166 state_next = STATE_WACK; 167 bready_next = 1; 168 end else begin 169 wvalid_next = 1; 170 end 171 end 172 STATE_WACK: begin 173 if (m00_axi_bvalid) begin 174 state_next = STATE_IDLE; 175 txn_done_next = 1; 176 end else begin 177 bready_next = 1; 178 end 179 end 180 STATE_RADDR: begin 181 if (m00_axi_arready) begin 182 state_next = STATE_RDATA; 183 rready_next = 1; 184 end else begin 185 arvalid_next = 1; 186 end 187 end 188 STATE_RDATA: begin 189 if (m00_axi_rvalid) begin 190 state_next = STATE_IDLE; 191 txn_done_next = 1; 192 txn_data_next = m00_axi_rdata; 193 end else begin 194 rready_next = 1; 195 end 196 end 197 default: begin 198 state_next = STATE_IDLE; 199 end 200 endcase 201 end 202 203 always @(*) begin 204 case (dbg_addr) 205 DBG_R_IDCODE: dbg_rdata = DBG_IDCODE; 206 DBG_R_GETDATA: dbg_rdata = txn_data; 207 DBG_R_GETADDR: dbg_rdata = txn_addr; 208 DBG_R_STATUS: dbg_rdata = { 31'd0, txn_done }; 209 default: dbg_rdata = 32'hFFFFFFFF; 210 endcase 211 end 212 213 debugport jtag( 214 .o_rd(dbg_rd), 215 .o_wr(dbg_wr), 216 .o_addr(dbg_addr), 217 .o_wdata(dbg_wdata), 218 .i_rdata(dbg_rdata), 219 .clk(clk) 220 ); 221 222 endmodule