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,208 @@
1
+ -- generated by Vertigo VHDL tool
2
+ library ieee;
3
+ use ieee.std_logic_1164.all;
4
+
5
+ package insn_helpers is
6
+ function insn_rs(insn_in : std_ulogic_vector) return std_ulogic_vector
7
+ function insn_rt(insn_in : std_ulogic_vector) return std_ulogic_vector
8
+ function insn_ra(insn_in : std_ulogic_vector) return std_ulogic_vector
9
+ function insn_rb(insn_in : std_ulogic_vector) return std_ulogic_vector
10
+ function insn_si(insn_in : std_ulogic_vector) return std_ulogic_vector
11
+ function insn_ui(insn_in : std_ulogic_vector) return std_ulogic_vector
12
+ function insn_l(insn_in : std_ulogic_vector) return std_ulogic
13
+ function insn_sh32(insn_in : std_ulogic_vector) return std_ulogic_vector
14
+ function insn_mb32(insn_in : std_ulogic_vector) return std_ulogic_vector
15
+ function insn_me32(insn_in : std_ulogic_vector) return std_ulogic_vector
16
+ function insn_li(insn_in : std_ulogic_vector) return std_ulogic_vector
17
+ function insn_lk(insn_in : std_ulogic_vector) return std_ulogic
18
+ function insn_aa(insn_in : std_ulogic_vector) return std_ulogic
19
+ function insn_rc(insn_in : std_ulogic_vector) return std_ulogic
20
+ function insn_oe(insn_in : std_ulogic_vector) return std_ulogic
21
+ function insn_bd(insn_in : std_ulogic_vector) return std_ulogic_vector
22
+ function insn_bf(insn_in : std_ulogic_vector) return std_ulogic_vector
23
+ function insn_bfa(insn_in : std_ulogic_vector) return std_ulogic_vector
24
+ function insn_cr(insn_in : std_ulogic_vector) return std_ulogic_vector
25
+ function insn_bt(insn_in : std_ulogic_vector) return std_ulogic_vector
26
+ function insn_ba(insn_in : std_ulogic_vector) return std_ulogic_vector
27
+ function insn_bb(insn_in : std_ulogic_vector) return std_ulogic_vector
28
+ function insn_fxm(insn_in : std_ulogic_vector) return std_ulogic_vector
29
+ function insn_bo(insn_in : std_ulogic_vector) return std_ulogic_vector
30
+ function insn_bi(insn_in : std_ulogic_vector) return std_ulogic_vector
31
+ function insn_bh(insn_in : std_ulogic_vector) return std_ulogic_vector
32
+ function insn_d(insn_in : std_ulogic_vector) return std_ulogic_vector
33
+ function insn_ds(insn_in : std_ulogic_vector) return std_ulogic_vector
34
+ function insn_to(insn_in : std_ulogic_vector) return std_ulogic_vector
35
+ function insn_bc(insn_in : std_ulogic_vector) return std_ulogic_vector
36
+ function insn_sh(insn_in : std_ulogic_vector) return std_ulogic_vector
37
+ function insn_me(insn_in : std_ulogic_vector) return std_ulogic_vector
38
+ function insn_mb(insn_in : std_ulogic_vector) return std_ulogic_vector
39
+
40
+ end insn_helpers;
41
+
42
+ package body insn_helpers is
43
+
44
+ function insn_rs(insn_in : std_ulogic_vector) return std_ulogic_vector is
45
+ begin
46
+ return insn_in(25 downto 21);
47
+ end function insn_rs;
48
+
49
+ function insn_rt(insn_in : std_ulogic_vector) return std_ulogic_vector is
50
+ begin
51
+ return insn_in(25 downto 21);
52
+ end function insn_rt;
53
+
54
+ function insn_ra(insn_in : std_ulogic_vector) return std_ulogic_vector is
55
+ begin
56
+ return insn_in(20 downto 16);
57
+ end function insn_ra;
58
+
59
+ function insn_rb(insn_in : std_ulogic_vector) return std_ulogic_vector is
60
+ begin
61
+ return insn_in(15 downto 11);
62
+ end function insn_rb;
63
+
64
+ function insn_si(insn_in : std_ulogic_vector) return std_ulogic_vector is
65
+ begin
66
+ return insn_in(15 downto 0);
67
+ end function insn_si;
68
+
69
+ function insn_ui(insn_in : std_ulogic_vector) return std_ulogic_vector is
70
+ begin
71
+ return insn_in(15 downto 0);
72
+ end function insn_ui;
73
+
74
+ function insn_l(insn_in : std_ulogic_vector) return std_ulogic is
75
+ begin
76
+ return insn_in(21);
77
+ end function insn_l;
78
+
79
+ function insn_sh32(insn_in : std_ulogic_vector) return std_ulogic_vector is
80
+ begin
81
+ return insn_in(15 downto 11);
82
+ end function insn_sh32;
83
+
84
+ function insn_mb32(insn_in : std_ulogic_vector) return std_ulogic_vector is
85
+ begin
86
+ return insn_in(10 downto 6);
87
+ end function insn_mb32;
88
+
89
+ function insn_me32(insn_in : std_ulogic_vector) return std_ulogic_vector is
90
+ begin
91
+ return insn_in(5 downto 1);
92
+ end function insn_me32;
93
+
94
+ function insn_li(insn_in : std_ulogic_vector) return std_ulogic_vector is
95
+ begin
96
+ return insn_in(25 downto 2);
97
+ end function insn_li;
98
+
99
+ function insn_lk(insn_in : std_ulogic_vector) return std_ulogic is
100
+ begin
101
+ return insn_in(0);
102
+ end function insn_lk;
103
+
104
+ function insn_aa(insn_in : std_ulogic_vector) return std_ulogic is
105
+ begin
106
+ return insn_in(1);
107
+ end function insn_aa;
108
+
109
+ function insn_rc(insn_in : std_ulogic_vector) return std_ulogic is
110
+ begin
111
+ return insn_in(0);
112
+ end function insn_rc;
113
+
114
+ function insn_oe(insn_in : std_ulogic_vector) return std_ulogic is
115
+ begin
116
+ return insn_in(10);
117
+ end function insn_oe;
118
+
119
+ function insn_bd(insn_in : std_ulogic_vector) return std_ulogic_vector is
120
+ begin
121
+ return insn_in(15 downto 2);
122
+ end function insn_bd;
123
+
124
+ function insn_bf(insn_in : std_ulogic_vector) return std_ulogic_vector is
125
+ begin
126
+ return insn_in(25 downto 23);
127
+ end function insn_bf;
128
+
129
+ function insn_bfa(insn_in : std_ulogic_vector) return std_ulogic_vector is
130
+ begin
131
+ return insn_in(20 downto 18);
132
+ end function insn_bfa;
133
+
134
+ function insn_cr(insn_in : std_ulogic_vector) return std_ulogic_vector is
135
+ begin
136
+ return insn_in(10 downto 1);
137
+ end function insn_cr;
138
+
139
+ function insn_bb(insn_in : std_ulogic_vector) return std_ulogic_vector is
140
+ begin
141
+ return insn_in(15 downto 11);
142
+ end function insn_bb;
143
+
144
+ function insn_ba(insn_in : std_ulogic_vector) return std_ulogic_vector is
145
+ begin
146
+ return insn_in(20 downto 16);
147
+ end function insn_ba;
148
+
149
+ function insn_bt(insn_in : std_ulogic_vector) return std_ulogic_vector is
150
+ begin
151
+ return insn_in(25 downto 21);
152
+ end function insn_bt;
153
+
154
+ function insn_fxm(insn_in : std_ulogic_vector) return std_ulogic_vector is
155
+ begin
156
+ return insn_in(19 downto 12);
157
+ end function insn_fxm;
158
+
159
+ function insn_bo(insn_in : std_ulogic_vector) return std_ulogic_vector is
160
+ begin
161
+ return insn_in(25 downto 21);
162
+ end function insn_bo;
163
+
164
+ function insn_bi(insn_in : std_ulogic_vector) return std_ulogic_vector is
165
+ begin
166
+ return insn_in(20 downto 16);
167
+ end function insn_bi;
168
+
169
+ function insn_bh(insn_in : std_ulogic_vector) return std_ulogic_vector is
170
+ begin
171
+ return insn_in(12 downto 11);
172
+ end function insn_bh;
173
+
174
+ function insn_d(insn_in : std_ulogic_vector) return std_ulogic_vector is
175
+ begin
176
+ return insn_in(15 downto 0);
177
+ end function insn_d;
178
+
179
+ function insn_ds(insn_in : std_ulogic_vector) return std_ulogic_vector is
180
+ begin
181
+ return insn_in(15 downto 2);
182
+ end function insn_ds;
183
+
184
+ function insn_to(insn_in : std_ulogic_vector) return std_ulogic_vector is
185
+ begin
186
+ return insn_in(25 downto 21);
187
+ end function insn_to;
188
+
189
+ function insn_bc(insn_in : std_ulogic_vector) return std_ulogic_vector is
190
+ begin
191
+ return insn_in(10 downto 6);
192
+ end function insn_bc;
193
+
194
+ function insn_sh(insn_in : std_ulogic_vector) return std_ulogic_vector is
195
+ begin
196
+ return insn_in(1) & insn_in(15 downto 11);
197
+ end function insn_sh;
198
+
199
+ function insn_me(insn_in : std_ulogic_vector) return std_ulogic_vector is
200
+ begin
201
+ return insn_in(5) & insn_in(10 downto 6);
202
+ end function insn_me;
203
+
204
+ function insn_mb(insn_in : std_ulogic_vector) return std_ulogic_vector is
205
+ begin
206
+ return insn_in(5) & insn_in(10 downto 6);
207
+ end function insn_mb;
208
+ end insn_helpers;
@@ -0,0 +1 @@
1
+ ../microwatt/loadstore1.vhdl
@@ -0,0 +1,222 @@
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.helpers.all;
8
+
9
+ entity loadstore1 is
10
+ port(
11
+ clk : in std_ulogic;
12
+ rst : in std_ulogic;
13
+ l_in : in execute1toloadstore1type;
14
+ l_out : out loadstore1towritebacktype;
15
+ d_out : out loadstore1todcachetype;
16
+ d_in : in dcachetoloadstore1type;
17
+ dc_stall : in std_ulogic;
18
+ stall_out : out std_ulogic);
19
+ end entity loadstore1;
20
+
21
+ architecture behave of loadstore1 is
22
+
23
+ type state_t is (idle,second_req,first_ack_wait,last_ack_wait,ld_update);
24
+
25
+ type reg_stage_t is record
26
+ load : std_ulogic;
27
+ addr : std_ulogic_vector(63 downto 0);
28
+ store_data : std_ulogic_vector(63 downto 0);
29
+ load_data : std_ulogic_vector(63 downto 0);
30
+ write_reg : gpr_index_t;
31
+ length : std_ulogic_vector(3 downto 0);
32
+ byte_reverse : std_ulogic;
33
+ sign_extend : std_ulogic;
34
+ update : std_ulogic;
35
+ update_reg : gpr_index_t;
36
+ xerc : xer_common_t;
37
+ reserve : std_ulogic;
38
+ rc : std_ulogic;
39
+ nc : std_ulogic;
40
+ state : state_t;
41
+ second_bytes : std_ulogic_vector(7 downto 0);
42
+ end record;
43
+
44
+ type byte_sel_t is array(range 0 to 7) of std_ulogic;
45
+
46
+ subtype byte_trim_t is std_ulogic_vector(1 downto 0);
47
+
48
+ type trim_ctl_t is array(range 0 to 7) of byte_trim_t;
49
+ signal r : reg_stage_t;
50
+ signal rin : reg_stage_t;
51
+ signal lsu_sum : std_ulogic_vector(63 downto 0);
52
+
53
+ function length_to_sel(length : in std_logic_vector(3 downto 0)) return std_ulogic_vector is
54
+ begin
55
+ case length is
56
+ when "0001" =>
57
+ return "00000001";
58
+ when "0010" =>
59
+ return "00000011";
60
+ when "0100" =>
61
+ return "00001111";
62
+ when "1000" =>
63
+ return "11111111";
64
+ when others =>
65
+ return "00000000";
66
+ end case;
67
+ end function length_to_sel;
68
+
69
+ function xfer_data_sel(size : in std_logic_vector(3 downto 0);address : in std_logic_vector(2 downto 0)) return std_ulogic_vector is
70
+ variable longsel : std_ulogic_vector(15 downto 0);
71
+ begin
72
+ longsel := "00000000" & length_to_sel(size);
73
+ return std_ulogic_vector(shift_left(unsigned(longsel),to_integer(unsigned(address))));
74
+ end function xfer_data_sel;
75
+ begin
76
+
77
+ lsu_sum <= std_ulogic_vector(unsigned(l_in.addr1) + unsigned(l_in.addr2)) when l_in.valid = '1' else (others => '0');
78
+
79
+ loadstore1_0 : process(clk)
80
+ begin
81
+ if rising_edge(clk) then
82
+ if rst = '1' then
83
+ r.state <= idle;
84
+ else
85
+ r <= rin;
86
+ end if;
87
+ end if;
88
+ end process;
89
+
90
+ loadstore1_1 : process(all)
91
+ variable v : reg_stage_t;
92
+ variable brev_lenm1 : unsigned(2 downto 0);
93
+ variable byte_offset : unsigned(2 downto 0);
94
+ variable j : integer;
95
+ variable k : unsigned(2 downto 0);
96
+ variable kk : unsigned(3 downto 0);
97
+ variable long_sel : std_ulogic_vector(15 downto 0);
98
+ variable byte_sel : std_ulogic_vector(7 downto 0);
99
+ variable req : std_ulogic;
100
+ variable stall : std_ulogic;
101
+ variable addr : std_ulogic_vector(63 downto 0);
102
+ variable wdata : std_ulogic_vector(63 downto 0);
103
+ variable write_enable : std_ulogic;
104
+ variable do_update : std_ulogic;
105
+ variable two_dwords : std_ulogic;
106
+ variable done : std_ulogic;
107
+ variable data_permuted : std_ulogic_vector(63 downto 0);
108
+ variable data_trimmed : std_ulogic_vector(63 downto 0);
109
+ variable use_second : byte_sel_t;
110
+ variable trim_ctl : trim_ctl_t;
111
+ variable negative : std_ulogic;
112
+ begin
113
+ v := r;
114
+ req := '0';
115
+ stall := '0';
116
+ done := '0';
117
+ byte_sel := (others => '0');
118
+ addr := lsu_sum;
119
+ write_enable := '0';
120
+ do_update := '0';
121
+ two_dwords := or(r.second_bytes);
122
+ if r.load = '1' then
123
+ byte_offset := unsigned(r.addr(2 downto 0));
124
+ brev_lenm1 := "000";
125
+ if r.byte_reverse = '1' then
126
+ brev_lenm1 := unsigned(r.length(2 downto 0)) - 1;
127
+ end if;
128
+ negative := (r.length(3) and data_permuted(63)) or (r.length(2) and data_permuted(31)) or (r.length(1) and data_permuted(15)) or (r.length(0) and data_permuted(7));
129
+ end if;
130
+ case r.state is
131
+ when idle =>
132
+ if l_in.valid = '1' then
133
+ v.load := l_in.load;
134
+ v.addr := lsu_sum;
135
+ v.write_reg := l_in.write_reg;
136
+ v.length := l_in.length;
137
+ v.byte_reverse := l_in.byte_reverse;
138
+ v.sign_extend := l_in.sign_extend;
139
+ v.update := l_in.update;
140
+ v.update_reg := l_in.update_reg;
141
+ v.xerc := l_in.xerc;
142
+ v.reserve := l_in.reserve;
143
+ v.rc := l_in.rc;
144
+ v.nc := l_in.ci;
145
+ if lsu_sum(31 downto 28) = "1100" then
146
+ v.nc := '1';
147
+ end if;
148
+ long_sel := xfer_data_sel(l_in.length,v.addr(2 downto 0));
149
+ byte_sel := long_sel(7 downto 0);
150
+ v.second_bytes := long_sel(15 downto 8);
151
+ v.addr := lsu_sum;
152
+ if v.load = '0' then
153
+ byte_offset := unsigned(lsu_sum(2 downto 0));
154
+ brev_lenm1 := "000";
155
+ if l_in.byte_reverse = '1' then
156
+ brev_lenm1 := unsigned(l_in.length(2 downto 0)) - 1;
157
+ end if;
158
+ end if;
159
+ req := '1';
160
+ stall := '1';
161
+ if long_sel(15 downto 8) = "00000000" then
162
+ v.state := last_ack_wait;
163
+ else
164
+ v.state := second_req;
165
+ end if;
166
+ end if;
167
+ when second_req =>
168
+ addr := std_ulogic_vector(unsigned(r.addr(63 downto 3)) + 1) & "000";
169
+ byte_sel := r.second_bytes;
170
+ req := '1';
171
+ stall := '1';
172
+ v.state := first_ack_wait;
173
+ when first_ack_wait =>
174
+ stall := '1';
175
+ if d_in.valid = '1' then
176
+ v.state := last_ack_wait;
177
+ if r.load = '1' then
178
+ v.load_data := data_permuted;
179
+ end if;
180
+ end if;
181
+ when last_ack_wait =>
182
+ stall := '1';
183
+ if d_in.valid = '1' then
184
+ write_enable := r.load;
185
+ if r.load = '1' and r.update = '1' then
186
+ v.state := ld_update;
187
+ else
188
+ do_update := r.update;
189
+ stall := '0';
190
+ done := '1';
191
+ v.state := idle;
192
+ end if;
193
+ end if;
194
+ when ld_update =>
195
+ do_update := '1';
196
+ v.state := idle;
197
+ done := '1';
198
+ end case;
199
+ d_out.valid <= req;
200
+ d_out.load <= v.load;
201
+ d_out.nc <= v.nc;
202
+ d_out.reserve <= v.reserve;
203
+ d_out.addr <= addr;
204
+ d_out.data <= v.store_data;
205
+ d_out.byte_sel <= byte_sel;
206
+ l_out.valid <= done;
207
+ if do_update = '1' then
208
+ l_out.write_enable <= '1';
209
+ l_out.write_reg <= r.update_reg;
210
+ l_out.write_data <= r.addr;
211
+ else
212
+ l_out.write_enable <= write_enable;
213
+ l_out.write_reg <= r.write_reg;
214
+ l_out.write_data <= data_trimmed;
215
+ end if;
216
+ l_out.xerc <= r.xerc;
217
+ l_out.rc <= r.rc and done;
218
+ l_out.store_done <= d_in.store_done;
219
+ stall_out <= stall;
220
+ rin <= v;
221
+ end process;
222
+ end behave;
@@ -0,0 +1 @@
1
+ ../microwatt/logical.vhdl
@@ -0,0 +1,87 @@
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.decode_types.all;
7
+
8
+ entity logical is
9
+ port(
10
+ rs : in std_ulogic_vector(63 downto 0);
11
+ rb : in std_ulogic_vector(63 downto 0);
12
+ op : in insn_type_t;
13
+ invert_in : in std_ulogic;
14
+ invert_out : in std_ulogic;
15
+ result : out std_ulogic_vector(63 downto 0);
16
+ datalen : in std_logic_vector(3 downto 0);
17
+ popcnt : out std_ulogic_vector(63 downto 0);
18
+ parity : out std_ulogic_vector(63 downto 0));
19
+ end entity logical;
20
+
21
+ architecture behaviour of logical is
22
+
23
+ subtype twobit is unsigned(1 downto 0);
24
+
25
+ type twobit32 is array(range 0 to 31) of twobit;
26
+ signal pc2 : twobit32;
27
+
28
+ subtype threebit is unsigned(2 downto 0);
29
+
30
+ type threebit16 is array(range 0 to 15) of threebit;
31
+ signal pc4 : threebit16;
32
+
33
+ subtype fourbit is unsigned(3 downto 0);
34
+
35
+ type fourbit8 is array(range 0 to 7) of fourbit;
36
+ signal pc8 : fourbit8;
37
+
38
+ subtype sixbit is unsigned(5 downto 0);
39
+
40
+ type sixbit2 is array(range 0 to 1) of sixbit;
41
+ signal pc32 : sixbit2;
42
+ signal par0 : std_ulogic;
43
+ signal par1 : std_ulogic;
44
+ begin
45
+
46
+
47
+ logical_0 : process(all)
48
+ variable rb_adj : std_ulogic_vector(63 downto 0);
49
+ variable tmp : std_ulogic_vector(63 downto 0);
50
+ begin
51
+ rb_adj := rb;
52
+ if invert_in = '1' then
53
+ rb_adj := rb;
54
+ end if;
55
+ case op is
56
+ when op_and =>
57
+ tmp := rs and rb_adj;
58
+ when op_or =>
59
+ tmp := rs or rb_adj;
60
+ when others =>
61
+ tmp := rs xor rb_adj;
62
+ end case;
63
+ result <= tmp;
64
+ if invert_out = '1' then
65
+ result <= tmp;
66
+ end if;
67
+ ;
68
+ ;
69
+ popcnt <= (others => '0');
70
+ if datalen(3 downto 2) = "00" then
71
+ ;
72
+ elsif datalen(3) = '0' then
73
+ ;
74
+ else
75
+ popcnt(6 downto 0) <= std_ulogic_vector(('0' & pc32(0)) + ('0' & pc32(1)));
76
+ end if;
77
+ par0 <= rs(0) xor rs(8) xor rs(16) xor rs(24);
78
+ par1 <= rs(32) xor rs(40) xor rs(48) xor rs(56);
79
+ parity <= (others => '0');
80
+ if datalen(3) = '1' then
81
+ parity(0) <= par0 xor par1;
82
+ else
83
+ parity(0) <= par0;
84
+ parity(32) <= par1;
85
+ end if;
86
+ end process;
87
+ end behaviour;