vjtag_max80.sv 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. //
  2. // vjtag_max80.sv
  3. //
  4. // Access the SDRAM and allow the CPU to take interrupts and receive
  5. // a command opcode via virtual JTAG.
  6. //
  7. // The module supports the following command codes over virtual JTAG:
  8. //
  9. // These chains use a common 1-bit boolean register:
  10. //
  11. // 00000 - bypass
  12. // 00010 - trigger IRQ on update_IR
  13. // 00100 - trigger system (soft) reset on update_IR
  14. // 0011x - assert halt while bit set
  15. // 0100x - memory underrun status flag, clear on capture
  16. //
  17. // These chains use a common 32-bit shift register:
  18. //
  19. // 1001x - address register (only bits [24:2] settable)
  20. // 1010x - read data from memory
  21. // 1011x - write data to memory
  22. // 1100x - command register to CPU
  23. // 1101x - command register to CPU, trigger IRQ on update_DR
  24. // 1110x - info register from CPU
  25. // 1111x - status register from CPU, clear on capture
  26. //
  27. // Setting bit 0 suppresses all register updates (but not other
  28. // side effects), allowing for nondestructive reads.
  29. //
  30. // The CPU registers are:
  31. //
  32. // 0 - CPU command register (readonly)
  33. // 1 - CPU information register (rw)
  34. // 2 - CPU status register (rw)
  35. // 3 - CPU status register set bits (rw1)
  36. //
  37. module vjtag_max80
  38. #(
  39. parameter [31:0] sdram_base_addr,
  40. parameter sdram_bits
  41. ) (
  42. input rst_n,
  43. input sys_clk,
  44. dram_bus.dstr sdram,
  45. input cpu_valid,
  46. input [6:2] cpu_addr,
  47. input [31:0] cpu_wdata,
  48. input [ 3:0] cpu_wstrb,
  49. output [31:0] cpu_rdata,
  50. output cpu_irq,
  51. output cpu_halt,
  52. output reg reset_cmd
  53. );
  54. wire v_tdi;
  55. wire v_tdo;
  56. wire [4:0] v_ir;
  57. wire v_tck;
  58. wire v_st_cdr;
  59. wire v_st_sdr;
  60. wire v_st_e1dr;
  61. wire v_st_pdr;
  62. wire v_st_e2dr;
  63. wire v_st_udr;
  64. wire v_st_cir;
  65. wire v_st_uir;
  66. vjtag vjtag (
  67. .tdi ( v_tdi ),
  68. .tdo ( v_tdo ),
  69. .tck ( v_tck ), // Really nothing virtual...
  70. .ir_in ( v_ir ),
  71. .ir_out ( ),
  72. .virtual_state_cdr ( v_st_cdr ),
  73. .virtual_state_e1dr ( v_st_e1dr ),
  74. .virtual_state_e2dr ( v_st_e2dr ),
  75. .virtual_state_pdr ( v_st_pdr ),
  76. .virtual_state_sdr ( v_st_sdr ),
  77. .virtual_state_udr ( v_st_udr ),
  78. .virtual_state_uir ( v_st_uir ),
  79. .virtual_state_cir ( v_st_cir )
  80. );
  81. localparam cmd_bypass = 4'b0000;
  82. localparam cmd_irq = 4'b0001;
  83. localparam cmd_reset = 4'b0010;
  84. localparam cmd_halt = 4'b0011;
  85. localparam cmd_memerr = 4'b0100;
  86. localparam cmd_mem0 = 4'b1000;
  87. localparam cmd_memaddr = 4'b1001;
  88. localparam cmd_memread = 4'b1010;
  89. localparam cmd_memwrite = 4'b1011;
  90. localparam cmd_memwr = 3'b101; // Common bits of read and write
  91. localparam cmd_cpucmd = 4'b1100;
  92. localparam cmd_cpucmd_irq = 4'b1101; // cpucmd but trigger IRQ
  93. localparam cmd_cpuinfo = 4'b1110;
  94. localparam cmd_cpustatus = 4'b1111;
  95. reg jtag_bypass;
  96. reg [31:0] jtag_shr;
  97. reg tdi_s;
  98. // Latched information for use in the synchronous state machine
  99. reg [3:0] ir_cmd; // Command part of IR
  100. reg ir_ro; // Readonly (update suppress)
  101. reg st_cdr_s;
  102. reg st_sdr_s;
  103. reg st_xdr_s; // Any state between CDR and UDR, exclusively
  104. reg st_udr_s;
  105. reg st_uir_s;
  106. always @(posedge v_tck)
  107. begin
  108. jtag_bypass <= v_ir == cmd_bypass;
  109. tdi_s <= v_tdi;
  110. ir_cmd <= v_ir[4:1];
  111. ir_ro <= v_ir[0];
  112. st_cdr_s <= v_st_cdr;
  113. st_sdr_s <= v_st_sdr;
  114. st_xdr_s <= v_st_sdr|v_st_e1dr|v_st_e2dr|v_st_pdr;
  115. st_udr_s <= v_st_udr;
  116. st_uir_s <= v_st_uir;
  117. end
  118. assign v_tdo = jtag_bypass ? tdi_s : jtag_shr[0];
  119. // Sync incoming JTAG signals. Only tck needs an actual
  120. // synchronizer; the rest just need holding registers (see above)
  121. // as the delay of tck will guarantee the others are stable.
  122. wire tck_s;
  123. synchronizer #(.width(1)) tck_sync
  124. (
  125. .rst_n ( rst_n ),
  126. .clk ( sys_clk ),
  127. .d ( v_tck ),
  128. .q ( tck_s )
  129. );
  130. // Mask of memaddr bits that are not settable: the top bits
  131. // and the bottom two bits (byte within dword)
  132. localparam [31:0] memaddr_mask = (1'b1 << sdram_bits) - 3'b100;
  133. function logic [31:0] maskaddr (input [31:0] addr);
  134. maskaddr = (addr & memaddr_mask) | sdram_base_addr;
  135. endfunction
  136. reg jtag_cpu_irq = 1'b0;
  137. reg jtag_cpu_halt = 1'b0;
  138. reg jtag_reset_cmd = 1'b0;
  139. assign cpu_irq = jtag_cpu_irq;
  140. assign cpu_halt = jtag_cpu_halt;
  141. assign reset_cmd = jtag_reset_cmd;
  142. reg [31:0] jtag_memaddr = maskaddr(32'b0);
  143. reg [31:0] jtag_cpucmd;
  144. reg [31:0] jtag_cpuinfo;
  145. reg [ 7:0] jtag_cpustatus;
  146. reg mem_valid;
  147. reg mem_write;
  148. reg [31:0] mem_addr;
  149. wire [31:0] mem_addr_next = maskaddr(mem_addr + 3'h4);
  150. wire [31:0] mem_rdata;
  151. reg [31:0] mem_wdata;
  152. wire mem_ready;
  153. reg mem_done;
  154. reg mem_error; // Memory underrun
  155. reg tck_q;
  156. reg tck_stb;
  157. always @(posedge sys_clk)
  158. begin
  159. tck_q <= tck_s;
  160. tck_stb <= tck_s & ~tck_q;
  161. end
  162. // Keep a counter to keep track of SDRAM data bit count; this is to
  163. // allow streaming of data to/from SDRAM without leaving the
  164. // SDR state.
  165. reg [4:0] sdr_ctr;
  166. always @(posedge sys_clk)
  167. begin
  168. if ( ~rst_n )
  169. jtag_reset_cmd <= 1'b0;
  170. jtag_cpu_irq <= 1'b0;
  171. if ( tck_stb )
  172. begin
  173. if ( st_sdr_s )
  174. begin
  175. if ( ir_cmd[3] )
  176. jtag_shr <= { tdi_s, jtag_shr[31:1] };
  177. else
  178. jtag_shr <= { 30'bx, tdi_s, jtag_shr[1] };
  179. end
  180. if ( st_cdr_s )
  181. case ( ir_cmd )
  182. cmd_halt: jtag_shr[0] <= jtag_cpu_halt;
  183. cmd_memerr: begin
  184. jtag_shr[0] <= mem_error;
  185. if ( ~ir_ro ) mem_error <= 1'b0;
  186. end
  187. cmd_mem0, cmd_memaddr, cmd_memread, cmd_memwrite:
  188. jtag_shr <= jtag_memaddr;
  189. cmd_cpucmd, cmd_cpucmd_irq:
  190. jtag_shr <= jtag_cpucmd;
  191. cmd_cpuinfo: jtag_shr <= jtag_cpuinfo;
  192. cmd_cpustatus: jtag_shr <= jtag_cpustatus;
  193. default: ;
  194. endcase // case ( ir_cmd )
  195. // For performance, the SDRAM data can be streamed
  196. // without exiting the shift_DR state, so this is
  197. // based on a counter rather than going to the DR_update
  198. // state.
  199. //
  200. // Note: for cmd_memread, this will trigger an
  201. // unnecessary memory load at the end, but that is
  202. // completely harmless, and we cannot know until the clock
  203. // comes in if we need it or not, so we have to
  204. // suppress the update until we know that the user will
  205. // be reading the fetched data.
  206. if ( ir_cmd[3:1] == cmd_memwr )
  207. begin
  208. if ( st_cdr_s )
  209. begin
  210. mem_done <= 1'b0;
  211. mem_valid <= 1'b0;
  212. mem_write <= ir_cmd[0];
  213. end
  214. if ( ~st_xdr_s )
  215. begin
  216. sdr_ctr <= 5'b0;
  217. mem_addr <= jtag_memaddr;
  218. end
  219. if ( st_sdr_s )
  220. begin
  221. sdr_ctr <= sdr_ctr + 1'b1;
  222. // Applicable to both read and write
  223. case ( sdr_ctr )
  224. 5'd31: begin
  225. if ( mem_valid )
  226. mem_error <= 1'b1; // Underrun!
  227. end
  228. default: ;
  229. endcase // case ( sdr_ctr )
  230. if ( ~mem_write )
  231. // Read
  232. case ( sdr_ctr )
  233. 5'd1: begin
  234. // For a read, make sure we are committed
  235. // to reading the new word
  236. if ( ~ir_ro )
  237. jtag_memaddr <= mem_addr;
  238. mem_valid <= 1'b1;
  239. mem_done <= 1'b0;
  240. end
  241. 5'd31: begin
  242. jtag_shr <= mem_rdata;
  243. end
  244. default: ;
  245. endcase // case ( sdr_ctr )
  246. else
  247. // Write
  248. case ( sdr_ctr )
  249. 5'd31: begin
  250. mem_wdata <= jtag_shr;
  251. mem_valid <= 1'b1;
  252. mem_done <= 1'b0;
  253. if ( ~ir_ro )
  254. jtag_memaddr <= mem_addr_next;
  255. end
  256. default: ;
  257. endcase // case ( sdr_ctr )
  258. end // if ( st_sdr_s )
  259. end // if ( ir_cmd[3:1] == cmd_memwr )
  260. if ( st_uir_s )
  261. jtag_cpu_irq <= ir_cmd == cmd_irq;
  262. else if ( st_udr_s )
  263. jtag_cpu_irq <= ir_cmd == cmd_cpucmd_irq;
  264. if ( st_uir_s )
  265. jtag_reset_cmd <= jtag_reset_cmd | (ir_cmd == cmd_reset);
  266. if ( st_udr_s & ~ir_ro )
  267. case ( ir_cmd )
  268. cmd_halt: jtag_cpu_halt <= jtag_shr[0];
  269. cmd_memaddr: jtag_memaddr <= maskaddr(jtag_shr);
  270. cmd_cpucmd, cmd_cpucmd_irq:
  271. jtag_cpucmd <= jtag_shr;
  272. default: /* nothing */ ;
  273. endcase // case ( ir_cmd )
  274. end // if ( tck_stb )
  275. // Increment the temporary address register if applicable,
  276. // but only after the previous transaction is done...
  277. if ( mem_valid & mem_ready )
  278. begin
  279. mem_valid <= 1'b0;
  280. mem_done <= 1'b1;
  281. mem_addr <= mem_addr_next;
  282. end
  283. end
  284. dram_port #(32) mem
  285. (
  286. .bus ( sdram ),
  287. .prio ( 2'd2 ),
  288. .addr ( mem_addr ),
  289. .valid ( mem_valid ),
  290. .wd ( mem_wdata ),
  291. .wstrb ( {4{mem_write}} ),
  292. .ready ( mem_ready ),
  293. .rd ( mem_rdata )
  294. );
  295. wire [7:0] cpustatus_new =
  296. ( tck_stb & st_cdr_s & ~ir_ro & (ir_cmd == cmd_cpustatus) )
  297. ? 'b0 : jtag_cpustatus;
  298. always @(negedge rst_n or posedge sys_clk)
  299. if (~rst_n)
  300. begin
  301. jtag_cpuinfo <= 'b0;
  302. jtag_cpustatus <= 'b0;
  303. end
  304. else
  305. begin
  306. jtag_cpustatus <= cpustatus_new;
  307. if ( cpu_valid )
  308. begin
  309. case ( cpu_addr )
  310. 5'b00001: begin
  311. if ( cpu_wstrb[0] ) jtag_cpuinfo[7:0] <= cpu_wdata[7:0];
  312. if ( cpu_wstrb[1] ) jtag_cpuinfo[15:8] <= cpu_wdata[15:8];
  313. if ( cpu_wstrb[2] ) jtag_cpuinfo[23:16] <= cpu_wdata[23:16];
  314. if ( cpu_wstrb[3] ) jtag_cpuinfo[31:24] <= cpu_wdata[31:24];
  315. end
  316. 5'b00010: begin
  317. if ( cpu_wstrb[0] ) jtag_cpustatus <= cpu_wdata[7:0];
  318. // Add more if the width of jtag_cpustatus is increased
  319. end
  320. 5'b00011: begin
  321. if ( cpu_wstrb[0] )
  322. jtag_cpustatus <= cpustatus_new | cpu_wdata[7:0];
  323. end
  324. default: /* nothing */;
  325. endcase // case ( cpu_addr[1:0] )
  326. end // if ( cpu_valid )
  327. end
  328. always @(*)
  329. casez ( cpu_addr )
  330. 5'b00000: cpu_rdata = jtag_cpucmd;
  331. 5'b00001: cpu_rdata = jtag_cpuinfo;
  332. 5'b0001?: cpu_rdata = jtag_cpustatus;
  333. default: cpu_rdata = 32'bx;
  334. endcase // casez ( cpu_addr )
  335. endmodule // vjtag_max80