dmi_dtm_tb.vhdl 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4. library work;
  5. use work.common.all;
  6. use work.wishbone_types.all;
  7. library unisim;
  8. use unisim.vcomponents.all;
  9. entity dmi_dtm_tb is
  10. end dmi_dtm_tb;
  11. architecture behave of dmi_dtm_tb is
  12. signal clk : std_ulogic;
  13. signal rst : std_ulogic;
  14. constant clk_period : time := 10 ns;
  15. constant jclk_period : time := 30 ns;
  16. -- DMI debug bus signals
  17. signal dmi_addr : std_ulogic_vector(7 downto 0);
  18. signal dmi_din : std_ulogic_vector(63 downto 0);
  19. signal dmi_dout : std_ulogic_vector(63 downto 0);
  20. signal dmi_req : std_ulogic;
  21. signal dmi_wr : std_ulogic;
  22. signal dmi_ack : std_ulogic;
  23. -- Global JTAG signals (used by BSCANE2 inside dmi_dtm
  24. alias j : glob_jtag_t is glob_jtag;
  25. -- Wishbone interfaces
  26. signal wishbone_ram_in : wishbone_slave_out;
  27. signal wishbone_ram_out : wishbone_master_out;
  28. begin
  29. dtm: entity work.dmi_dtm
  30. generic map(
  31. ABITS => 8,
  32. DBITS => 64
  33. )
  34. port map(
  35. sys_clk => clk,
  36. sys_reset => rst,
  37. dmi_addr => dmi_addr,
  38. dmi_din => dmi_din,
  39. dmi_dout => dmi_dout,
  40. dmi_req => dmi_req,
  41. dmi_wr => dmi_wr,
  42. dmi_ack => dmi_ack
  43. );
  44. simple_ram_0: entity work.wishbone_bram_wrapper
  45. generic map(RAM_INIT_FILE => "main_ram.bin",
  46. MEMORY_SIZE => 524288)
  47. port map(clk => clk, rst => rst,
  48. wishbone_in => wishbone_ram_out,
  49. wishbone_out => wishbone_ram_in);
  50. wishbone_debug_0: entity work.wishbone_debug_master
  51. port map(clk => clk, rst => rst,
  52. dmi_addr => dmi_addr(1 downto 0),
  53. dmi_dout => dmi_din,
  54. dmi_din => dmi_dout,
  55. dmi_wr => dmi_wr,
  56. dmi_ack => dmi_ack,
  57. dmi_req => dmi_req,
  58. wb_in => wishbone_ram_in,
  59. wb_out => wishbone_ram_out);
  60. -- system clock
  61. sys_clk: process
  62. begin
  63. clk <= '1';
  64. wait for clk_period / 2;
  65. clk <= '0';
  66. wait for clk_period / 2;
  67. end process sys_clk;
  68. -- system sim: just reset and wait
  69. sys_sim: process
  70. begin
  71. rst <= '1';
  72. wait for clk_period;
  73. rst <= '0';
  74. wait;
  75. end process;
  76. -- jtag sim process
  77. sim_jtag: process
  78. procedure clock(count: in INTEGER) is
  79. begin
  80. for i in 1 to count loop
  81. j.tck <= '0';
  82. wait for jclk_period/2;
  83. j.tck <= '1';
  84. wait for jclk_period/2;
  85. end loop;
  86. end procedure clock;
  87. procedure shift_out(val: in std_ulogic_vector) is
  88. begin
  89. for i in 0 to val'length-1 loop
  90. j.tdi <= val(i);
  91. clock(1);
  92. end loop;
  93. end procedure shift_out;
  94. procedure shift_in(val: out std_ulogic_vector) is
  95. begin
  96. for i in val'length-1 downto 0 loop
  97. val := j.tdo & val(val'length-1 downto 1);
  98. clock(1);
  99. end loop;
  100. end procedure shift_in;
  101. procedure send_command(
  102. addr : in std_ulogic_vector(7 downto 0);
  103. data : in std_ulogic_vector(63 downto 0);
  104. op : in std_ulogic_vector(1 downto 0)) is
  105. begin
  106. j.capture <= '1';
  107. clock(1);
  108. j.capture <= '0';
  109. clock(1);
  110. j.shift <= '1';
  111. shift_out(op);
  112. shift_out(data);
  113. shift_out(addr);
  114. j.shift <= '0';
  115. j.update <= '1';
  116. clock(1);
  117. j.update <= '0';
  118. clock(1);
  119. end procedure send_command;
  120. procedure read_resp(
  121. op : out std_ulogic_vector(1 downto 0);
  122. data : out std_ulogic_vector(63 downto 0)) is
  123. variable addr : std_ulogic_vector(7 downto 0);
  124. begin
  125. j.capture <= '1';
  126. clock(1);
  127. j.capture <= '0';
  128. clock(1);
  129. j.shift <= '1';
  130. shift_in(op);
  131. shift_in(data);
  132. shift_in(addr);
  133. j.shift <= '0';
  134. j.update <= '1';
  135. clock(1);
  136. j.update <= '0';
  137. clock(1);
  138. end procedure read_resp;
  139. procedure dmi_write(addr : in std_ulogic_vector(7 downto 0);
  140. data : in std_ulogic_vector(63 downto 0)) is
  141. variable resp_op : std_ulogic_vector(1 downto 0);
  142. variable resp_data : std_ulogic_vector(63 downto 0);
  143. variable timeout : integer;
  144. begin
  145. send_command(addr, data, "10");
  146. loop
  147. read_resp(resp_op, resp_data);
  148. case resp_op is
  149. when "00" =>
  150. return;
  151. when "11" =>
  152. timeout := timeout + 1;
  153. assert timeout < 0
  154. report "dmi_write timed out !" severity error;
  155. when others =>
  156. assert 0 > 1 report "dmi_write got odd status: " &
  157. to_hstring(resp_op) severity error;
  158. end case;
  159. end loop;
  160. end procedure dmi_write;
  161. procedure dmi_read(addr : in std_ulogic_vector(7 downto 0);
  162. data : out std_ulogic_vector(63 downto 0)) is
  163. variable resp_op : std_ulogic_vector(1 downto 0);
  164. variable timeout : integer;
  165. begin
  166. send_command(addr, (others => '0'), "01");
  167. loop
  168. read_resp(resp_op, data);
  169. case resp_op is
  170. when "00" =>
  171. return;
  172. when "11" =>
  173. timeout := timeout + 1;
  174. assert timeout < 0
  175. report "dmi_read timed out !" severity error;
  176. when others =>
  177. assert 0 > 1 report "dmi_read got odd status: " &
  178. to_hstring(resp_op) severity error;
  179. end case;
  180. end loop;
  181. end procedure dmi_read;
  182. variable data : std_ulogic_vector(63 downto 0);
  183. begin
  184. -- init & reset
  185. j.reset <= '1';
  186. j.sel <= "0000";
  187. j.capture <= '0';
  188. j.update <= '0';
  189. j.shift <= '0';
  190. j.tdi <= '0';
  191. j.tms <= '0';
  192. j.runtest <= '0';
  193. clock(5);
  194. j.reset <= '0';
  195. clock(5);
  196. -- select chain 2
  197. j.sel <= "0010";
  198. clock(1);
  199. -- send command
  200. dmi_read(x"00", data);
  201. report "Read addr reg:" & to_hstring(data);
  202. report "Writing addr reg to all 1's";
  203. dmi_write(x"00", (others => '1'));
  204. dmi_read(x"00", data);
  205. report "Read addr reg:" & to_hstring(data);
  206. report "Writing ctrl reg to all 1's";
  207. dmi_write(x"02", (others => '1'));
  208. dmi_read(x"02", data);
  209. report "Read ctrl reg:" & to_hstring(data);
  210. report "Read memory at 0...\n";
  211. dmi_write(x"00", x"0000000000000000");
  212. dmi_write(x"02", x"00000000000007ff");
  213. dmi_read(x"01", data);
  214. report "00:" & to_hstring(data);
  215. dmi_read(x"01", data);
  216. report "08:" & to_hstring(data);
  217. dmi_read(x"01", data);
  218. report "10:" & to_hstring(data);
  219. dmi_read(x"01", data);
  220. report "18:" & to_hstring(data);
  221. clock(10);
  222. std.env.finish;
  223. end process;
  224. end behave;