vertigo_vhdl 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/bin/vertigo +7 -0
  3. data/lib/vertigo.rb +4 -0
  4. data/lib/vertigo/ast.rb +87 -0
  5. data/lib/vertigo/ast_vertigo_rkgen.rb +607 -0
  6. data/lib/vertigo/code.rb +57 -0
  7. data/lib/vertigo/compiler.rb +61 -0
  8. data/lib/vertigo/generic_lexer.rb +61 -0
  9. data/lib/vertigo/generic_parser.rb +44 -0
  10. data/lib/vertigo/indent.rb +20 -0
  11. data/lib/vertigo/lexer.rb +172 -0
  12. data/lib/vertigo/parser.rb +1458 -0
  13. data/lib/vertigo/pretty_printer.rb +749 -0
  14. data/lib/vertigo/runner.rb +115 -0
  15. data/lib/vertigo/tb_generator.rb +81 -0
  16. data/lib/vertigo/template.tb.vhd +72 -0
  17. data/lib/vertigo/token.rb +67 -0
  18. data/lib/vertigo/version.rb +3 -0
  19. data/lib/vertigo/vertigo.rkg +354 -0
  20. data/lib/vertigo/visitor_vertigo_rkgen.rb +447 -0
  21. data/tests/ghdl_tests/fsm.vhd +98 -0
  22. data/tests/ghdl_tests/fsm_synth.vhd +248 -0
  23. data/tests/ghdl_tests/test_fsm.vhd +162 -0
  24. data/tests/parser_tests/else.vhd +64 -0
  25. data/tests/parser_tests/test_MUST_fail.vhd +1 -0
  26. data/tests/parser_tests/test_accelerator.vhd +160 -0
  27. data/tests/parser_tests/test_accelerator_pp.vhd +144 -0
  28. data/tests/parser_tests/test_aggregate.vhd +17 -0
  29. data/tests/parser_tests/test_aggregate_pp.vhd +15 -0
  30. data/tests/parser_tests/test_archi_1.vhd +45 -0
  31. data/tests/parser_tests/test_archi_1_pp.vhd +41 -0
  32. data/tests/parser_tests/test_array_array_00.vhd +25 -0
  33. data/tests/parser_tests/test_array_array_00_pp.vhd +25 -0
  34. data/tests/parser_tests/test_array_urange.vhd +25 -0
  35. data/tests/parser_tests/test_array_urange_pp.vhd +25 -0
  36. data/tests/parser_tests/test_chu-1.vhd +80 -0
  37. data/tests/parser_tests/test_chu-1_pp.vhd +104 -0
  38. data/tests/parser_tests/test_concat.vhd +11 -0
  39. data/tests/parser_tests/test_concat_pp.vhd +14 -0
  40. data/tests/parser_tests/test_counter.vhd +35 -0
  41. data/tests/parser_tests/test_counter_pp.vhd +35 -0
  42. data/tests/parser_tests/test_de2.vhd +358 -0
  43. data/tests/parser_tests/test_de2_pp.vhd +274 -0
  44. data/tests/parser_tests/test_encode.vhd +2679 -0
  45. data/tests/parser_tests/test_encode_pp.vhd +2549 -0
  46. data/tests/parser_tests/test_fsm.vhd +162 -0
  47. data/tests/parser_tests/test_fsm_pp.vhd +125 -0
  48. data/tests/parser_tests/test_fsm_synth.vhd +248 -0
  49. data/tests/parser_tests/test_fsm_synth_pp.vhd +197 -0
  50. data/tests/parser_tests/test_function-01.vhd +33 -0
  51. data/tests/parser_tests/test_function-01_pp.vhd +18 -0
  52. data/tests/parser_tests/test_lfsr.vhd +75 -0
  53. data/tests/parser_tests/test_lfsr_pp.vhd +44 -0
  54. data/tests/parser_tests/test_microwatt_cache_ram.vhd +1 -0
  55. data/tests/parser_tests/test_microwatt_cache_ram_pp.vhd +68 -0
  56. data/tests/parser_tests/test_microwatt_common.vhd +1 -0
  57. data/tests/parser_tests/test_microwatt_common_pp.vhd +336 -0
  58. data/tests/parser_tests/test_microwatt_control.vhd +1 -0
  59. data/tests/parser_tests/test_microwatt_control_pp.vhd +187 -0
  60. data/tests/parser_tests/test_microwatt_core.vhd +1 -0
  61. data/tests/parser_tests/test_microwatt_core_debug.vhd +1 -0
  62. data/tests/parser_tests/test_microwatt_core_debug_pp.vhd +104 -0
  63. data/tests/parser_tests/test_microwatt_core_pp.vhd +231 -0
  64. data/tests/parser_tests/test_microwatt_core_tb.vhd +1 -0
  65. data/tests/parser_tests/test_microwatt_core_tb_pp.vhd +43 -0
  66. data/tests/parser_tests/test_microwatt_countzero.vhd +1 -0
  67. data/tests/parser_tests/test_microwatt_countzero_pp.vhd +120 -0
  68. data/tests/parser_tests/test_microwatt_countzero_tb.vhd +1 -0
  69. data/tests/parser_tests/test_microwatt_countzero_tb_pp.vhd +70 -0
  70. data/tests/parser_tests/test_microwatt_cr_file.vhd +1 -0
  71. data/tests/parser_tests/test_microwatt_cr_file_pp.vhd +74 -0
  72. data/tests/parser_tests/test_microwatt_cr_hazard.vhd +1 -0
  73. data/tests/parser_tests/test_microwatt_cr_hazard_pp.vhd +51 -0
  74. data/tests/parser_tests/test_microwatt_crhelpers.vhd +1 -0
  75. data/tests/parser_tests/test_microwatt_crhelpers_pp.vhd +48 -0
  76. data/tests/parser_tests/test_microwatt_dcache.vhd +1 -0
  77. data/tests/parser_tests/test_microwatt_dcache_pp.vhd +481 -0
  78. data/tests/parser_tests/test_microwatt_dcache_tb.vhd +1 -0
  79. data/tests/parser_tests/test_microwatt_dcache_tb_pp.vhd +98 -0
  80. data/tests/parser_tests/test_microwatt_decode1.vhd +1 -0
  81. data/tests/parser_tests/test_microwatt_decode1_pp.vhd +138 -0
  82. data/tests/parser_tests/test_microwatt_decode2.vhd +1 -0
  83. data/tests/parser_tests/test_microwatt_decode2_pp.vhd +300 -0
  84. data/tests/parser_tests/test_microwatt_decode_types.vhd +1 -0
  85. data/tests/parser_tests/test_microwatt_decode_types_pp.vhd +67 -0
  86. data/tests/parser_tests/test_microwatt_divider.vhd +1 -0
  87. data/tests/parser_tests/test_microwatt_divider_pp.vhd +132 -0
  88. data/tests/parser_tests/test_microwatt_divider_tb.vhd +1 -0
  89. data/tests/parser_tests/test_microwatt_divider_tb_pp.vhd +95 -0
  90. data/tests/parser_tests/test_microwatt_dmi_dtm_dummy.vhd +1 -0
  91. data/tests/parser_tests/test_microwatt_dmi_dtm_dummy_pp.vhd +29 -0
  92. data/tests/parser_tests/test_microwatt_dmi_dtm_tb.vhd +1 -0
  93. data/tests/parser_tests/test_microwatt_dmi_dtm_tb_pp.vhd +197 -0
  94. data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx.vhd +1 -0
  95. data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx_pp.vhd +139 -0
  96. data/tests/parser_tests/test_microwatt_execute1.vhd +1 -0
  97. data/tests/parser_tests/test_microwatt_execute1_pp.vhd +689 -0
  98. data/tests/parser_tests/test_microwatt_fetch1.vhd +1 -0
  99. data/tests/parser_tests/test_microwatt_fetch1_pp.vhd +88 -0
  100. data/tests/parser_tests/test_microwatt_fetch2.vhd +1 -0
  101. data/tests/parser_tests/test_microwatt_fetch2_pp.vhd +79 -0
  102. data/tests/parser_tests/test_microwatt_glibc_random.vhd +1 -0
  103. data/tests/parser_tests/test_microwatt_glibc_random_helpers.vhd +1 -0
  104. data/tests/parser_tests/test_microwatt_glibc_random_helpers_pp.vhd +25 -0
  105. data/tests/parser_tests/test_microwatt_glibc_random_pp.vhd +41 -0
  106. data/tests/parser_tests/test_microwatt_gpr_hazard.vhd +1 -0
  107. data/tests/parser_tests/test_microwatt_gpr_hazard_pp.vhd +68 -0
  108. data/tests/parser_tests/test_microwatt_helpers.vhd +1 -0
  109. data/tests/parser_tests/test_microwatt_helpers_pp.vhd +153 -0
  110. data/tests/parser_tests/test_microwatt_icache.vhd +1 -0
  111. data/tests/parser_tests/test_microwatt_icache_pp.vhd +337 -0
  112. data/tests/parser_tests/test_microwatt_icache_tb.vhd +1 -0
  113. data/tests/parser_tests/test_microwatt_icache_tb_pp.vhd +104 -0
  114. data/tests/parser_tests/test_microwatt_insn_helpers.vhd +1 -0
  115. data/tests/parser_tests/test_microwatt_insn_helpers_pp.vhd +208 -0
  116. data/tests/parser_tests/test_microwatt_loadstore1.vhd +1 -0
  117. data/tests/parser_tests/test_microwatt_loadstore1_pp.vhd +222 -0
  118. data/tests/parser_tests/test_microwatt_logical.vhd +1 -0
  119. data/tests/parser_tests/test_microwatt_logical_pp.vhd +87 -0
  120. data/tests/parser_tests/test_microwatt_multiply.vhd +1 -0
  121. data/tests/parser_tests/test_microwatt_multiply_pp.vhd +84 -0
  122. data/tests/parser_tests/test_microwatt_multiply_tb.vhd +1 -0
  123. data/tests/parser_tests/test_microwatt_multiply_tb_pp.vhd +75 -0
  124. data/tests/parser_tests/test_microwatt_plru.vhd +1 -0
  125. data/tests/parser_tests/test_microwatt_plru_pp.vhd +46 -0
  126. data/tests/parser_tests/test_microwatt_plru_tb.vhd +1 -0
  127. data/tests/parser_tests/test_microwatt_plru_tb_pp.vhd +93 -0
  128. data/tests/parser_tests/test_microwatt_ppc_fx_insns.vhd +1 -0
  129. data/tests/parser_tests/test_microwatt_ppc_fx_insns_pp.vhd +665 -0
  130. data/tests/parser_tests/test_microwatt_register_file.vhd +1 -0
  131. data/tests/parser_tests/test_microwatt_register_file_pp.vhd +86 -0
  132. data/tests/parser_tests/test_microwatt_rotator.vhd +1 -0
  133. data/tests/parser_tests/test_microwatt_rotator_pp.vhd +149 -0
  134. data/tests/parser_tests/test_microwatt_rotator_tb.vhd +1 -0
  135. data/tests/parser_tests/test_microwatt_rotator_tb_pp.vhd +134 -0
  136. data/tests/parser_tests/test_microwatt_sim_bram.vhd +1 -0
  137. data/tests/parser_tests/test_microwatt_sim_bram_helpers.vhd +1 -0
  138. data/tests/parser_tests/test_microwatt_sim_bram_helpers_pp.vhd +52 -0
  139. data/tests/parser_tests/test_microwatt_sim_bram_pp.vhd +53 -0
  140. data/tests/parser_tests/test_microwatt_sim_console.vhd +1 -0
  141. data/tests/parser_tests/test_microwatt_sim_console_pp.vhd +43 -0
  142. data/tests/parser_tests/test_microwatt_sim_jtag.vhd +1 -0
  143. data/tests/parser_tests/test_microwatt_sim_jtag_pp.vhd +64 -0
  144. data/tests/parser_tests/test_microwatt_sim_jtag_socket.vhd +1 -0
  145. data/tests/parser_tests/test_microwatt_sim_jtag_socket_pp.vhd +36 -0
  146. data/tests/parser_tests/test_microwatt_sim_uart.vhd +1 -0
  147. data/tests/parser_tests/test_microwatt_sim_uart_pp.vhd +90 -0
  148. data/tests/parser_tests/test_microwatt_soc.vhd +1 -0
  149. data/tests/parser_tests/test_microwatt_soc_pp.vhd +195 -0
  150. data/tests/parser_tests/test_microwatt_utils.vhd +1 -0
  151. data/tests/parser_tests/test_microwatt_utils_pp.vhd +39 -0
  152. data/tests/parser_tests/test_microwatt_wishbone_arbiter.vhd +1 -0
  153. data/tests/parser_tests/test_microwatt_wishbone_arbiter_pp.vhd +54 -0
  154. data/tests/parser_tests/test_microwatt_wishbone_bram_tb.vhd +1 -0
  155. data/tests/parser_tests/test_microwatt_wishbone_bram_tb_pp.vhd +157 -0
  156. data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper.vhd +1 -0
  157. data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper_pp.vhd +62 -0
  158. data/tests/parser_tests/test_microwatt_wishbone_debug_master.vhd +1 -0
  159. data/tests/parser_tests/test_microwatt_wishbone_debug_master_pp.vhd +124 -0
  160. data/tests/parser_tests/test_microwatt_wishbone_types.vhd +1 -0
  161. data/tests/parser_tests/test_microwatt_wishbone_types_pp.vhd +38 -0
  162. data/tests/parser_tests/test_microwatt_writeback.vhd +1 -0
  163. data/tests/parser_tests/test_microwatt_writeback_pp.vhd +87 -0
  164. data/tests/parser_tests/test_package-1.vhd +68 -0
  165. data/tests/parser_tests/test_package-1_pp.vhd +53 -0
  166. data/tests/parser_tests/test_precedence.vhd +13 -0
  167. data/tests/parser_tests/test_precedence_pp.vhd +16 -0
  168. data/tests/parser_tests/test_selected_sig.vhd +14 -0
  169. data/tests/parser_tests/test_selected_sig_pp.vhd +10 -0
  170. data/tests/parser_tests/test_slice.vhd +15 -0
  171. data/tests/parser_tests/test_slice_pp.vhd +16 -0
  172. data/tests/parser_tests/test_tb-00.vhd +94 -0
  173. data/tests/parser_tests/test_tb-00_pp.vhd +71 -0
  174. data/tests/parser_tests/test_type_decl_02.vhd +9 -0
  175. data/tests/parser_tests/test_type_decl_02_pp.vhd +11 -0
  176. data/tests/parser_tests/test_use.vhd +7 -0
  177. data/tests/parser_tests/test_use_pp.vhd +10 -0
  178. data/tests/parser_tests/test_while_1.vhd +38 -0
  179. data/tests/parser_tests/test_while_1_pp.vhd +26 -0
  180. data/tests/parser_tests/test_with-00.vhd +21 -0
  181. data/tests/parser_tests/test_with-00_pp.vhd +12 -0
  182. data/tests/tb_gen_tests/test_accelerator.vhd +160 -0
  183. metadata +224 -0
@@ -0,0 +1 @@
1
+ ../microwatt/fetch1.vhdl
@@ -0,0 +1,88 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+ library work;
6
+ use work.common.all;
7
+
8
+ entity fetch1 is
9
+ generic(
10
+ reset_address : std_logic_vector(63 downto 0)(others => '0') := (others => '0'));
11
+ port(
12
+ clk : in std_ulogic;
13
+ rst : in std_ulogic;
14
+ stall_in : in std_ulogic;
15
+ flush_in : in std_ulogic;
16
+ stop_in : in std_ulogic;
17
+ e_in : in execute1tofetch1type;
18
+ i_out : out fetch1toicachetype);
19
+ end entity fetch1;
20
+
21
+ architecture behaviour of fetch1 is
22
+
23
+ type stop_state_t is (running,stopped,restarting);
24
+
25
+ type reg_internal_t is record
26
+ stop_state : stop_state_t;
27
+ end record;
28
+ signal r : fetch1toicachetype;
29
+ signal r_next : fetch1toicachetype;
30
+ signal r_int : reg_internal_t;
31
+ signal r_next_int : reg_internal_t;
32
+ begin
33
+
34
+
35
+ regs : process(clk)
36
+ begin
37
+ if rising_edge(clk) then
38
+ if r /= r_next then
39
+ report "fetch1 rst:" & std_ulogic'image(rst) & " r:" & std_ulogic'image(e_in.redirect) & " s:" & std_ulogic'image(stall_in) & " t:" & std_ulogic'image(stop_in) & " nia:" & to_hstring(r_next.nia) & " sm:" & std_ulogic'image(r_next.stop_mark);
40
+ end if;
41
+ r <= r_next;
42
+ r_int <= r_next_int;
43
+ end if;
44
+ end process;
45
+
46
+ comb : process(all)
47
+ variable v : fetch1toicachetype;
48
+ variable v_int : reg_internal_t;
49
+ variable increment : boolean;
50
+ begin
51
+ v := r;
52
+ v_int := r_int;
53
+ if rst = '1' then
54
+ v.nia := reset_address;
55
+ v_int.stop_state := running;
56
+ elsif e_in.redirect = '1' then
57
+ v.nia := e_in.redirect_nia;
58
+ elsif stall_in = '0' then
59
+ increment := true;
60
+ case v_int.stop_state is
61
+ when running =>
62
+ if stop_in = '1' then
63
+ increment := false;
64
+ v_int.stop_state := stopped;
65
+ end if;
66
+ when stopped =>
67
+ increment := false;
68
+ if stop_in = '0' then
69
+ v_int.stop_state := restarting;
70
+ end if;
71
+ when restarting =>
72
+ if stop_in = '0' then
73
+ v_int.stop_state := running;
74
+ else
75
+ v_int.stop_state := stopped;
76
+ end if;
77
+ end case;
78
+ if increment then
79
+ v.nia := std_logic_vector(unsigned(v.nia) + 4);
80
+ end if;
81
+ end if;
82
+ v.req := rst;
83
+ v.stop_mark := stop_in;
84
+ r_next <= v;
85
+ r_next_int <= v_int;
86
+ i_out <= r;
87
+ end process;
88
+ end behaviour;
@@ -0,0 +1 @@
1
+ ../microwatt/fetch2.vhdl
@@ -0,0 +1,79 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+ library work;
6
+ use work.common.all;
7
+ use work.wishbone_types.all;
8
+
9
+ entity fetch2 is
10
+ port(
11
+ clk : in std_ulogic;
12
+ rst : in std_ulogic;
13
+ stall_in : in std_ulogic;
14
+ flush_in : in std_ulogic;
15
+ i_in : in icachetofetch2type;
16
+ f_out : out fetch2todecode1type);
17
+ end entity fetch2;
18
+
19
+ architecture behaviour of fetch2 is
20
+
21
+ type reg_internal_type is record
22
+ stash : icachetofetch2type;
23
+ stash_valid : std_ulogic;
24
+ stopped : std_ulogic;
25
+ end record;
26
+ signal r_int : reg_internal_type;
27
+ signal rin_int : reg_internal_type;
28
+ signal r : fetch2todecode1type;
29
+ signal rin : fetch2todecode1type;
30
+ begin
31
+
32
+
33
+ regs : process(clk)
34
+ begin
35
+ if rising_edge(clk) then
36
+ if (r /= rin) then
37
+ report "fetch2 rst:" & std_ulogic'image(rst) & " s:" & std_ulogic'image(stall_in) & " f:" & std_ulogic'image(flush_in) & " t:" & std_ulogic'image(rin.stop_mark) & " v:" & std_ulogic'image(rin.valid) & " nia:" & to_hstring(rin.nia);
38
+ end if;
39
+ if rst = '1' or flush_in = '1' or stall_in = '0' then
40
+ r <= rin;
41
+ end if;
42
+ r_int <= rin_int;
43
+ end if;
44
+ end process;
45
+
46
+ comb : process(all)
47
+ variable v : fetch2todecode1type;
48
+ variable v_int : reg_internal_type;
49
+ variable v_i_in : icachetofetch2type;
50
+ begin
51
+ v := r;
52
+ v_int := r_int;
53
+ if stall_in = '1' and v_int.stash_valid = '0' then
54
+ v_int.stash := i_in;
55
+ v_int.stash_valid := '1';
56
+ end if;
57
+ v_i_in := i_in;
58
+ if v_int.stash_valid = '1' and stall_in = '0' then
59
+ v_i_in := v_int.stash;
60
+ v_int.stash_valid := '0';
61
+ end if;
62
+ v.valid := v_i_in.valid;
63
+ v.stop_mark := v_i_in.stop_mark;
64
+ v.nia := v_i_in.nia;
65
+ v.insn := v_i_in.insn;
66
+ if flush_in = '1' then
67
+ v_int.stash.valid := '0';
68
+ end if;
69
+ if flush_in = '1' or v.stop_mark = '1' then
70
+ v.valid := '0';
71
+ end if;
72
+ if rst = '1' then
73
+ v_int.stash_valid := '0';
74
+ end if;
75
+ rin <= v;
76
+ rin_int <= v_int;
77
+ f_out <= r;
78
+ end process;
79
+ end behaviour;
@@ -0,0 +1 @@
1
+ ../microwatt/glibc_random.vhdl
@@ -0,0 +1 @@
1
+ ../microwatt/glibc_random_helpers.vhdl
@@ -0,0 +1,25 @@
1
+ -- generated by Vertigo VHDL tool
2
+
3
+ package glibc_random_helpers is
4
+
5
+ procedure srand(
6
+ v : integer);
7
+ attribute foreign of srand : procedure is "vhpidirect srand";
8
+ function random() return integer
9
+ attribute foreign of random : function is "vhpidirect random";
10
+
11
+ end glibc_random_helpers;
12
+
13
+ package body glibc_random_helpers is
14
+
15
+ procedure srand(
16
+ v : integer) is
17
+ begin
18
+ assert false;
19
+ end srand;
20
+
21
+ function random() return integer is
22
+ begin
23
+ assert false;
24
+ end function random;
25
+ end glibc_random_helpers;
@@ -0,0 +1,41 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+ library work;
6
+ use work.glibc_random_helpers.all;
7
+
8
+ package glibc_random is
9
+ function pseudorand(a : integer) return std_ulogic_vector
10
+ function pseudorand1() return std_ulogic
11
+
12
+ end glibc_random;
13
+
14
+ package body glibc_random is
15
+
16
+ function pseudorand(a : integer) return std_ulogic_vector is
17
+ variable tmp1 : std_ulogic_vector(31 downto 0);
18
+ variable tmp2 : std_ulogic_vector(31 downto 0);
19
+ variable tmp3 : std_ulogic_vector(31 downto 0);
20
+ variable tmp4 : std_ulogic_vector(31 downto 0);
21
+ variable ret : std_ulogic_vector(63 downto 0);
22
+ begin
23
+ tmp1 := std_ulogic_vector(to_unsigned(random,32));
24
+ tmp2 := std_ulogic_vector(to_unsigned(random,32));
25
+ if a <= 32 then
26
+ ret := tmp1 & tmp2;
27
+ else
28
+ tmp3 := std_ulogic_vector(to_unsigned(random,32));
29
+ tmp4 := std_ulogic_vector(to_unsigned(random,32));
30
+ ret := tmp1(15 downto 0) & tmp2(15 downto 0) & tmp3(15 downto 0) & tmp4(15 downto 0);
31
+ end if;
32
+ return ret((a - 1) downto 0);
33
+ end function pseudorand;
34
+
35
+ function pseudorand1() return std_ulogic is
36
+ variable tmp : std_ulogic_vector(31 downto 0);
37
+ begin
38
+ tmp := std_ulogic_vector(to_unsigned(random,32));
39
+ return tmp(0);
40
+ end function pseudorand1;
41
+ end glibc_random;
@@ -0,0 +1 @@
1
+ ../microwatt/gpr_hazard.vhdl
@@ -0,0 +1,68 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+
6
+ entity gpr_hazard is
7
+ generic(
8
+ pipeline_depth : natural2 := 2);
9
+ port(
10
+ clk : in std_ulogic;
11
+ stall_in : in std_ulogic;
12
+ gpr_write_valid_in : in std_ulogic;
13
+ gpr_write_in : in std_ulogic_vector(5 downto 0);
14
+ bypass_avail : in std_ulogic;
15
+ gpr_read_valid_in : in std_ulogic;
16
+ gpr_read_in : in std_ulogic_vector(5 downto 0);
17
+ stall_out : out std_ulogic;
18
+ use_bypass : out std_ulogic);
19
+ end entity gpr_hazard;
20
+
21
+ architecture behaviour of gpr_hazard is
22
+
23
+ type pipeline_entry_type is record
24
+ valid : std_ulogic;
25
+ bypass : std_ulogic;
26
+ gpr : std_ulogic_vector(5 downto 0);
27
+ end record;
28
+ constant pipeline_entry_init : pipeline_entry_type := (valid => '0',bypass => '0',gpr => (others => '0'));
29
+
30
+ type pipeline_t is array(range 0 to pipeline_depth - 1) of pipeline_entry_type;
31
+ constant pipeline_t_init : pipeline_t := (others => pipeline_entry_init);
32
+ signal r : pipeline_t;
33
+ signal rin : pipeline_t := pipeline_t_init;
34
+ begin
35
+
36
+
37
+ gpr_hazard0 : process(clk)
38
+ begin
39
+ if rising_edge(clk) then
40
+ r <= rin;
41
+ end if;
42
+ end process;
43
+
44
+ gpr_hazard1 : process(all)
45
+ variable v : pipeline_t;
46
+ begin
47
+ v := r;
48
+ stall_out <= '0';
49
+ use_bypass <= '0';
50
+ if gpr_read_valid_in = '1' then
51
+ if r(0).valid = '1' and r(0).gpr = gpr_read_in then
52
+ if r(0).bypass = '1' and stall_in = '0' then
53
+ use_bypass <= '1';
54
+ else
55
+ stall_out <= '1';
56
+ end if;
57
+ end if;
58
+ end if;
59
+ if stall_in = '0' then
60
+ v(0).valid := gpr_write_valid_in;
61
+ v(0).bypass := bypass_avail;
62
+ v(0).gpr := gpr_write_in;
63
+ else
64
+ ;
65
+ end if;
66
+ rin <= v;
67
+ end process;
68
+ end behaviour;
@@ -0,0 +1 @@
1
+ ../microwatt/helpers.vhdl
@@ -0,0 +1,153 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+ use ieee.numeric_std.all;
5
+ library work;
6
+
7
+ package helpers is
8
+ function fls_32(val : std_ulogic_vector(31 downto 0)) return integer
9
+ function ffs_32(val : std_ulogic_vector(31 downto 0)) return integer
10
+ function fls_64(val : std_ulogic_vector(63 downto 0)) return integer
11
+ function ffs_64(val : std_ulogic_vector(63 downto 0)) return integer
12
+ function popcnt8(val : std_ulogic_vector(7 downto 0)) return std_ulogic_vector
13
+ function popcnt32(val : std_ulogic_vector(31 downto 0)) return std_ulogic_vector
14
+ function popcnt64(val : std_ulogic_vector(63 downto 0)) return std_ulogic_vector
15
+ function cmp_one_byte(a : std_ulogic_vector(7 downto 0);b : std_ulogic_vector(7 downto 0)) return std_ulogic_vector
16
+ function ppc_signed_compare(a : signed(63 downto 0);b : signed(63 downto 0);so : std_ulogic) return std_ulogic_vector
17
+ function ppc_unsigned_compare(a : unsigned(63 downto 0);b : unsigned(63 downto 0);so : std_ulogic) return std_ulogic_vector
18
+ function ra_or_zero(ra : std_ulogic_vector(63 downto 0);reg : std_ulogic_vector(4 downto 0)) return std_ulogic_vector
19
+ function byte_reverse(val : std_ulogic_vector(63 downto 0);size : integer) return std_ulogic_vector
20
+ function sign_extend(val : std_ulogic_vector(63 downto 0);size : natural) return std_ulogic_vector
21
+
22
+ end helpers;
23
+
24
+ package body helpers is
25
+
26
+ function fls_32(val : std_ulogic_vector(31 downto 0)) return integer is
27
+ variable ret : integer;
28
+ begin
29
+ ret := 32;
30
+ return ret;
31
+ end function fls_32;
32
+
33
+ function ffs_32(val : std_ulogic_vector(31 downto 0)) return integer is
34
+ variable ret : integer;
35
+ begin
36
+ ret := 32;
37
+ return ret;
38
+ end function ffs_32;
39
+
40
+ function fls_64(val : std_ulogic_vector(63 downto 0)) return integer is
41
+ variable ret : integer;
42
+ begin
43
+ ret := 64;
44
+ return ret;
45
+ end function fls_64;
46
+
47
+ function ffs_64(val : std_ulogic_vector(63 downto 0)) return integer is
48
+ variable ret : integer;
49
+ begin
50
+ ret := 64;
51
+ return ret;
52
+ end function ffs_64;
53
+
54
+ function popcnt8(val : std_ulogic_vector(7 downto 0)) return std_ulogic_vector is
55
+ variable ret : unsigned(3 downto 0) := (others => '0');
56
+ begin
57
+ ;
58
+ return std_ulogic_vector(resize(ret,val'length));
59
+ end function popcnt8;
60
+
61
+ function popcnt32(val : std_ulogic_vector(31 downto 0)) return std_ulogic_vector is
62
+ variable ret : unsigned(5 downto 0) := (others => '0');
63
+ begin
64
+ ;
65
+ return std_ulogic_vector(resize(ret,val'length));
66
+ end function popcnt32;
67
+
68
+ function popcnt64(val : std_ulogic_vector(63 downto 0)) return std_ulogic_vector is
69
+ variable ret : unsigned(6 downto 0) := (others => '0');
70
+ begin
71
+ ;
72
+ return std_ulogic_vector(resize(ret,val'length));
73
+ end function popcnt64;
74
+
75
+ function cmp_one_byte(a : std_ulogic_vector(7 downto 0);b : std_ulogic_vector(7 downto 0)) return std_ulogic_vector is
76
+ variable ret : std_ulogic_vector(7 downto 0);
77
+ begin
78
+ if a = b then
79
+ ret := x"ff";
80
+ else
81
+ ret := x"00";
82
+ end if;
83
+ return ret;
84
+ end function cmp_one_byte;
85
+
86
+ function ppc_signed_compare(a : signed(63 downto 0);b : signed(63 downto 0);so : std_ulogic) return std_ulogic_vector is
87
+ variable ret : std_ulogic_vector(2 downto 0);
88
+ begin
89
+ if a < b then
90
+ ret := "100";
91
+ elsif a > b then
92
+ ret := "010";
93
+ else
94
+ ret := "001";
95
+ end if;
96
+ return ret & so;
97
+ end function ppc_signed_compare;
98
+
99
+ function ppc_unsigned_compare(a : unsigned(63 downto 0);b : unsigned(63 downto 0);so : std_ulogic) return std_ulogic_vector is
100
+ variable ret : std_ulogic_vector(2 downto 0);
101
+ begin
102
+ if a < b then
103
+ ret := "100";
104
+ elsif a > b then
105
+ ret := "010";
106
+ else
107
+ ret := "001";
108
+ end if;
109
+ return ret & so;
110
+ end function ppc_unsigned_compare;
111
+
112
+ function ra_or_zero(ra : std_ulogic_vector(63 downto 0);reg : std_ulogic_vector(4 downto 0)) return std_ulogic_vector is
113
+ begin
114
+ if to_integer(unsigned(reg)) = 0 then
115
+ return x"0000000000000000";
116
+ else
117
+ return ra;
118
+ end if;
119
+ end function ra_or_zero;
120
+
121
+ function byte_reverse(val : std_ulogic_vector(63 downto 0);size : integer) return std_ulogic_vector is
122
+ variable ret : std_ulogic_vector(63 downto 0) := (others => '0');
123
+ begin
124
+ case size is
125
+ when 2 =>
126
+ ;
127
+ when 4 =>
128
+ ;
129
+ when 8 =>
130
+ ;
131
+ when others =>
132
+ report "bad byte reverse length " & integer'image(size) severity failure;
133
+ end case;
134
+ return ret;
135
+ end function byte_reverse;
136
+
137
+ function sign_extend(val : std_ulogic_vector(63 downto 0);size : natural) return std_ulogic_vector is
138
+ variable ret : signed(63 downto 0) := (others => '0');
139
+ variable upper : integer := 0;
140
+ begin
141
+ case size is
142
+ when 2 =>
143
+ ret := resize(signed(val(15 downto 0)),64);
144
+ when 4 =>
145
+ ret := resize(signed(val(31 downto 0)),64);
146
+ when 8 =>
147
+ ret := resize(signed(val(63 downto 0)),64);
148
+ when others =>
149
+ report "bad byte reverse length " & integer'image(size) severity failure;
150
+ end case;
151
+ return std_ulogic_vector(ret);
152
+ end function sign_extend;
153
+ end helpers;