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.
- checksums.yaml +7 -0
- data/bin/vertigo +7 -0
- data/lib/vertigo.rb +4 -0
- data/lib/vertigo/ast.rb +87 -0
- data/lib/vertigo/ast_vertigo_rkgen.rb +607 -0
- data/lib/vertigo/code.rb +57 -0
- data/lib/vertigo/compiler.rb +61 -0
- data/lib/vertigo/generic_lexer.rb +61 -0
- data/lib/vertigo/generic_parser.rb +44 -0
- data/lib/vertigo/indent.rb +20 -0
- data/lib/vertigo/lexer.rb +172 -0
- data/lib/vertigo/parser.rb +1458 -0
- data/lib/vertigo/pretty_printer.rb +749 -0
- data/lib/vertigo/runner.rb +115 -0
- data/lib/vertigo/tb_generator.rb +81 -0
- data/lib/vertigo/template.tb.vhd +72 -0
- data/lib/vertigo/token.rb +67 -0
- data/lib/vertigo/version.rb +3 -0
- data/lib/vertigo/vertigo.rkg +354 -0
- data/lib/vertigo/visitor_vertigo_rkgen.rb +447 -0
- data/tests/ghdl_tests/fsm.vhd +98 -0
- data/tests/ghdl_tests/fsm_synth.vhd +248 -0
- data/tests/ghdl_tests/test_fsm.vhd +162 -0
- data/tests/parser_tests/else.vhd +64 -0
- data/tests/parser_tests/test_MUST_fail.vhd +1 -0
- data/tests/parser_tests/test_accelerator.vhd +160 -0
- data/tests/parser_tests/test_accelerator_pp.vhd +144 -0
- data/tests/parser_tests/test_aggregate.vhd +17 -0
- data/tests/parser_tests/test_aggregate_pp.vhd +15 -0
- data/tests/parser_tests/test_archi_1.vhd +45 -0
- data/tests/parser_tests/test_archi_1_pp.vhd +41 -0
- data/tests/parser_tests/test_array_array_00.vhd +25 -0
- data/tests/parser_tests/test_array_array_00_pp.vhd +25 -0
- data/tests/parser_tests/test_array_urange.vhd +25 -0
- data/tests/parser_tests/test_array_urange_pp.vhd +25 -0
- data/tests/parser_tests/test_chu-1.vhd +80 -0
- data/tests/parser_tests/test_chu-1_pp.vhd +104 -0
- data/tests/parser_tests/test_concat.vhd +11 -0
- data/tests/parser_tests/test_concat_pp.vhd +14 -0
- data/tests/parser_tests/test_counter.vhd +35 -0
- data/tests/parser_tests/test_counter_pp.vhd +35 -0
- data/tests/parser_tests/test_de2.vhd +358 -0
- data/tests/parser_tests/test_de2_pp.vhd +274 -0
- data/tests/parser_tests/test_encode.vhd +2679 -0
- data/tests/parser_tests/test_encode_pp.vhd +2549 -0
- data/tests/parser_tests/test_fsm.vhd +162 -0
- data/tests/parser_tests/test_fsm_pp.vhd +125 -0
- data/tests/parser_tests/test_fsm_synth.vhd +248 -0
- data/tests/parser_tests/test_fsm_synth_pp.vhd +197 -0
- data/tests/parser_tests/test_function-01.vhd +33 -0
- data/tests/parser_tests/test_function-01_pp.vhd +18 -0
- data/tests/parser_tests/test_lfsr.vhd +75 -0
- data/tests/parser_tests/test_lfsr_pp.vhd +44 -0
- data/tests/parser_tests/test_microwatt_cache_ram.vhd +1 -0
- data/tests/parser_tests/test_microwatt_cache_ram_pp.vhd +68 -0
- data/tests/parser_tests/test_microwatt_common.vhd +1 -0
- data/tests/parser_tests/test_microwatt_common_pp.vhd +336 -0
- data/tests/parser_tests/test_microwatt_control.vhd +1 -0
- data/tests/parser_tests/test_microwatt_control_pp.vhd +187 -0
- data/tests/parser_tests/test_microwatt_core.vhd +1 -0
- data/tests/parser_tests/test_microwatt_core_debug.vhd +1 -0
- data/tests/parser_tests/test_microwatt_core_debug_pp.vhd +104 -0
- data/tests/parser_tests/test_microwatt_core_pp.vhd +231 -0
- data/tests/parser_tests/test_microwatt_core_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_core_tb_pp.vhd +43 -0
- data/tests/parser_tests/test_microwatt_countzero.vhd +1 -0
- data/tests/parser_tests/test_microwatt_countzero_pp.vhd +120 -0
- data/tests/parser_tests/test_microwatt_countzero_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_countzero_tb_pp.vhd +70 -0
- data/tests/parser_tests/test_microwatt_cr_file.vhd +1 -0
- data/tests/parser_tests/test_microwatt_cr_file_pp.vhd +74 -0
- data/tests/parser_tests/test_microwatt_cr_hazard.vhd +1 -0
- data/tests/parser_tests/test_microwatt_cr_hazard_pp.vhd +51 -0
- data/tests/parser_tests/test_microwatt_crhelpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_crhelpers_pp.vhd +48 -0
- data/tests/parser_tests/test_microwatt_dcache.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dcache_pp.vhd +481 -0
- data/tests/parser_tests/test_microwatt_dcache_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dcache_tb_pp.vhd +98 -0
- data/tests/parser_tests/test_microwatt_decode1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_decode1_pp.vhd +138 -0
- data/tests/parser_tests/test_microwatt_decode2.vhd +1 -0
- data/tests/parser_tests/test_microwatt_decode2_pp.vhd +300 -0
- data/tests/parser_tests/test_microwatt_decode_types.vhd +1 -0
- data/tests/parser_tests/test_microwatt_decode_types_pp.vhd +67 -0
- data/tests/parser_tests/test_microwatt_divider.vhd +1 -0
- data/tests/parser_tests/test_microwatt_divider_pp.vhd +132 -0
- data/tests/parser_tests/test_microwatt_divider_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_divider_tb_pp.vhd +95 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_dummy.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_dummy_pp.vhd +29 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_tb_pp.vhd +197 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx.vhd +1 -0
- data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx_pp.vhd +139 -0
- data/tests/parser_tests/test_microwatt_execute1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_execute1_pp.vhd +689 -0
- data/tests/parser_tests/test_microwatt_fetch1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_fetch1_pp.vhd +88 -0
- data/tests/parser_tests/test_microwatt_fetch2.vhd +1 -0
- data/tests/parser_tests/test_microwatt_fetch2_pp.vhd +79 -0
- data/tests/parser_tests/test_microwatt_glibc_random.vhd +1 -0
- data/tests/parser_tests/test_microwatt_glibc_random_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_glibc_random_helpers_pp.vhd +25 -0
- data/tests/parser_tests/test_microwatt_glibc_random_pp.vhd +41 -0
- data/tests/parser_tests/test_microwatt_gpr_hazard.vhd +1 -0
- data/tests/parser_tests/test_microwatt_gpr_hazard_pp.vhd +68 -0
- data/tests/parser_tests/test_microwatt_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_helpers_pp.vhd +153 -0
- data/tests/parser_tests/test_microwatt_icache.vhd +1 -0
- data/tests/parser_tests/test_microwatt_icache_pp.vhd +337 -0
- data/tests/parser_tests/test_microwatt_icache_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_icache_tb_pp.vhd +104 -0
- data/tests/parser_tests/test_microwatt_insn_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_insn_helpers_pp.vhd +208 -0
- data/tests/parser_tests/test_microwatt_loadstore1.vhd +1 -0
- data/tests/parser_tests/test_microwatt_loadstore1_pp.vhd +222 -0
- data/tests/parser_tests/test_microwatt_logical.vhd +1 -0
- data/tests/parser_tests/test_microwatt_logical_pp.vhd +87 -0
- data/tests/parser_tests/test_microwatt_multiply.vhd +1 -0
- data/tests/parser_tests/test_microwatt_multiply_pp.vhd +84 -0
- data/tests/parser_tests/test_microwatt_multiply_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_multiply_tb_pp.vhd +75 -0
- data/tests/parser_tests/test_microwatt_plru.vhd +1 -0
- data/tests/parser_tests/test_microwatt_plru_pp.vhd +46 -0
- data/tests/parser_tests/test_microwatt_plru_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_plru_tb_pp.vhd +93 -0
- data/tests/parser_tests/test_microwatt_ppc_fx_insns.vhd +1 -0
- data/tests/parser_tests/test_microwatt_ppc_fx_insns_pp.vhd +665 -0
- data/tests/parser_tests/test_microwatt_register_file.vhd +1 -0
- data/tests/parser_tests/test_microwatt_register_file_pp.vhd +86 -0
- data/tests/parser_tests/test_microwatt_rotator.vhd +1 -0
- data/tests/parser_tests/test_microwatt_rotator_pp.vhd +149 -0
- data/tests/parser_tests/test_microwatt_rotator_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_rotator_tb_pp.vhd +134 -0
- data/tests/parser_tests/test_microwatt_sim_bram.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_bram_helpers.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_bram_helpers_pp.vhd +52 -0
- data/tests/parser_tests/test_microwatt_sim_bram_pp.vhd +53 -0
- data/tests/parser_tests/test_microwatt_sim_console.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_console_pp.vhd +43 -0
- data/tests/parser_tests/test_microwatt_sim_jtag.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_jtag_pp.vhd +64 -0
- data/tests/parser_tests/test_microwatt_sim_jtag_socket.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_jtag_socket_pp.vhd +36 -0
- data/tests/parser_tests/test_microwatt_sim_uart.vhd +1 -0
- data/tests/parser_tests/test_microwatt_sim_uart_pp.vhd +90 -0
- data/tests/parser_tests/test_microwatt_soc.vhd +1 -0
- data/tests/parser_tests/test_microwatt_soc_pp.vhd +195 -0
- data/tests/parser_tests/test_microwatt_utils.vhd +1 -0
- data/tests/parser_tests/test_microwatt_utils_pp.vhd +39 -0
- data/tests/parser_tests/test_microwatt_wishbone_arbiter.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_arbiter_pp.vhd +54 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_tb.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_tb_pp.vhd +157 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper_pp.vhd +62 -0
- data/tests/parser_tests/test_microwatt_wishbone_debug_master.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_debug_master_pp.vhd +124 -0
- data/tests/parser_tests/test_microwatt_wishbone_types.vhd +1 -0
- data/tests/parser_tests/test_microwatt_wishbone_types_pp.vhd +38 -0
- data/tests/parser_tests/test_microwatt_writeback.vhd +1 -0
- data/tests/parser_tests/test_microwatt_writeback_pp.vhd +87 -0
- data/tests/parser_tests/test_package-1.vhd +68 -0
- data/tests/parser_tests/test_package-1_pp.vhd +53 -0
- data/tests/parser_tests/test_precedence.vhd +13 -0
- data/tests/parser_tests/test_precedence_pp.vhd +16 -0
- data/tests/parser_tests/test_selected_sig.vhd +14 -0
- data/tests/parser_tests/test_selected_sig_pp.vhd +10 -0
- data/tests/parser_tests/test_slice.vhd +15 -0
- data/tests/parser_tests/test_slice_pp.vhd +16 -0
- data/tests/parser_tests/test_tb-00.vhd +94 -0
- data/tests/parser_tests/test_tb-00_pp.vhd +71 -0
- data/tests/parser_tests/test_type_decl_02.vhd +9 -0
- data/tests/parser_tests/test_type_decl_02_pp.vhd +11 -0
- data/tests/parser_tests/test_use.vhd +7 -0
- data/tests/parser_tests/test_use_pp.vhd +10 -0
- data/tests/parser_tests/test_while_1.vhd +38 -0
- data/tests/parser_tests/test_while_1_pp.vhd +26 -0
- data/tests/parser_tests/test_with-00.vhd +21 -0
- data/tests/parser_tests/test_with-00_pp.vhd +12 -0
- data/tests/tb_gen_tests/test_accelerator.vhd +160 -0
- 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;
|