1 ---------------------------------------------------------------------------------
4 -- Filename: mbl_Pkg.vhd
5 -- Description: Package for the TUD MB-Lite implementation
7 -- Author: Huib Lincklaen Arriens
8 -- Delft University of Technology
9 -- Faculty EEMCS, Department ME&CE, Circuits and Systems
10 -- Date: September, 2010
12 -- Modified: September, 2013: Removed FSL
13 -- June, 2011: ALU_ACTION_Type extended to incorporate
14 -- MUL and BS instructions (Huib)
15 -- Adapted to work with separate fsl_M-
16 -- and fsl_S selectors and automatic
17 -- tumbl<_jtag><_fsl>.vhd generation (Huib)
18 -- July, 2011: function ef_nbits added (Huib)
21 --------------------------------------------------------------------------------
24 USE IEEE.std_logic_1164.all;
25 USE IEEE.std_logic_unsigned.all;
26 USE IEEE.numeric_std.all;
29 --------------------------------------------------------------------------------
31 --------------------------------------------------------------------------------
33 CONSTANT C_8_ZEROS : STD_LOGIC_VECTOR ( 7 DOWNTO 0) := X"00";
34 CONSTANT C_16_ZEROS : STD_LOGIC_VECTOR (15 DOWNTO 0) := X"0000";
35 CONSTANT C_24_ZEROS : STD_LOGIC_VECTOR (23 DOWNTO 0) := X"000000";
36 CONSTANT C_32_ZEROS : STD_LOGIC_VECTOR (31 DOWNTO 0) := X"00000000";
38 CONSTANT C_16_ONES : STD_LOGIC_VECTOR (15 DOWNTO 0) := X"FFFF";
39 CONSTANT C_24_ONES : STD_LOGIC_VECTOR (23 DOWNTO 0) := X"FFFFFF";
42 ----------------------------------------------------------------------------------------------
44 ----------------------------------------------------------------------------------------------
46 TYPE ALU_ACTION_Type IS (A_NOP, A_ADD, A_CMP, A_CMPU, A_OR, A_AND, A_XOR,
47 A_SHIFT, A_SEXT8, A_SEXT16, A_MFS, A_MTS,
48 A_MUL, A_BSLL, A_BSRL, A_BSRA, A_HALT);
49 TYPE ALU_IN1_Type IS (ALU_IN_REGA, ALU_IN_NOT_REGA, ALU_IN_PC, ALU_IN_ZERO);
50 TYPE ALU_IN2_Type IS (ALU_IN_REGB, ALU_IN_NOT_REGB, ALU_IN_IMM, ALU_IN_NOT_IMM);
51 TYPE ALU_CIN_Type IS (CIN_ZERO, CIN_ONE, FROM_MSR, FROM_IN1);
52 TYPE MSR_ACTION_Type IS (UPDATE_CARRY, KEEP_CARRY);
53 TYPE BRANCH_ACTION_Type IS (NO_BR, BR, BRL, BEQ, BNE, BLT, BLE, BGT, BGE);
54 TYPE WRB_ACTION_Type IS (NO_WRB, WRB_EX, WRB_MEM);
55 TYPE MEM_ACTION_Type IS (NO_MEM, WR_MEM, RD_MEM);
56 TYPE TRANSFER_SIZE_Type IS (WORD, HALFWORD, BYTE);
57 TYPE SAVE_REG_Type IS (NO_SAVE, SAVE_RA, SAVE_RB);
59 TYPE IF2ID_Type IS RECORD
60 program_counter : STD_LOGIC_VECTOR (31 DOWNTO 0);
63 TYPE ID2EX_Type IS RECORD
64 program_counter : STD_LOGIC_VECTOR (31 DOWNTO 0);
65 rdix_rA : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
66 rdix_rB : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
67 curr_rD : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
68 alu_Action : ALU_ACTION_Type;
69 alu_Op1 : ALU_IN1_Type;
70 alu_Op2 : ALU_IN2_Type;
71 alu_Cin : ALU_CIN_Type;
72 IMM16 : STD_LOGIC_VECTOR (15 DOWNTO 0);
74 msr_Action : MSR_ACTION_Type;
75 branch_Action : BRANCH_ACTION_Type;
76 mem_Action : MEM_ACTION_Type; -- rd_mem implies writeback
77 transfer_Size : TRANSFER_SIZE_Type;
78 wrb_Action : WRB_ACTION_Type;
81 TYPE ID2GPRF_Type IS RECORD
82 rdix_rA : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
83 rdix_rB : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
84 rdix_rD : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
87 TYPE INT_CTRL_Type IS RECORD
88 setup_int : STD_LOGIC;
89 rti_target : STD_LOGIC_VECTOR (31 DOWNTO 0);
93 TYPE ID2CTRL_Type IS RECORD
98 TYPE GPRF2EX_Type IS RECORD
99 data_rA : STD_LOGIC_VECTOR (31 DOWNTO 0);
100 data_rB : STD_LOGIC_VECTOR (31 DOWNTO 0);
101 data_rD : STD_LOGIC_VECTOR (31 DOWNTO 0);
104 TYPE IMM_LOCK_Type IS RECORD
106 IMM_hi16 : STD_LOGIC_VECTOR (15 DOWNTO 0);
109 TYPE MSR_Type IS RECORD
110 IE : STD_LOGIC; -- MSR[VHDL b1] = [MicroBlaze b30]
111 C : STD_LOGIC; -- MSR[VHDL b2 and b31] = [MicroBlaze b29 and b0]
114 TYPE EX2IF_Type IS RECORD
115 take_branch : STD_LOGIC;
116 branch_target : STD_LOGIC_VECTOR (31 DOWNTO 0);
119 TYPE HALT_Type IS RECORD
121 halt_code : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
124 TYPE EX2MEM_Type IS RECORD
125 mem_Action : MEM_ACTION_Type; -- RD_MEM implies writeback
126 wrb_Action : WRB_ACTION_Type;
127 exeq_result : STD_LOGIC_VECTOR (31 DOWNTO 0);
128 data_rD : STD_LOGIC_VECTOR (31 DOWNTO 0);
129 byte_Enable : STD_LOGIC_VECTOR ( 3 DOWNTO 0);
130 wrix_rD : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
133 TYPE WRB_Type IS RECORD
134 wrb_Action : WRB_ACTION_Type;
135 wrix_rD : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
136 data_rD : STD_LOGIC_VECTOR (31 DOWNTO 0);
139 TYPE HAZARD_WRB_Type IS RECORD
141 save_rX : SAVE_REG_Type;
142 data_rX : STD_LOGIC_VECTOR (31 DOWNTO 0);
143 data_rD : STD_LOGIC_VECTOR (31 DOWNTO 0);
146 TYPE MEM_REG_Type IS RECORD
147 wrb_Action : WRB_ACTION_Type;
148 exeq_result : STD_LOGIC_VECTOR (31 DOWNTO 0);
149 byte_Enable : STD_LOGIC_VECTOR ( 3 DOWNTO 0);
150 wrix_rD : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
153 TYPE MEM2CTRL_Type IS RECORD
158 TYPE CORE2DMEMB_Type IS RECORD
160 addr : STD_LOGIC_VECTOR (31 DOWNTO 0);
161 bSel : STD_LOGIC_VECTOR ( 3 DOWNTO 0);
163 data : STD_LOGIC_VECTOR (31 DOWNTO 0);
166 TYPE DMEMB2CORE_Type IS RECORD
168 data : STD_LOGIC_VECTOR (31 DOWNTO 0);
172 TYPE MEMORY_MAP_Type IS ARRAY(NATURAL RANGE <>) OF STD_LOGIC_VECTOR (31 DOWNTO 0);
173 -- NOTE: Use the named association format xxxx := ( 0 => X"A0010000" );
174 -- in case the array has to contain only one element !!
176 ----------------------------------------------------------------------------------------------
178 ----------------------------------------------------------------------------------------------
182 prog_cntr_i : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
183 inc_pc_i : IN STD_LOGIC;
184 EX2IF_i : IN EX2IF_Type;
185 IF2ID_o : OUT IF2ID_Type
191 USE_HW_MUL_g : BOOLEAN := TRUE;
192 USE_BARREL_g : BOOLEAN := TRUE;
193 COMPATIBILITY_MODE_g : BOOLEAN := FALSE
196 IF2ID_i : IN IF2ID_Type;
197 imem_data_i : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
199 ID2GPRF_o : OUT ID2GPRF_Type;
200 ID2EX_o : OUT ID2EX_Type;
202 INT_CTRL_i : IN INT_CTRL_Type;
203 ID2CTRL_o : OUT ID2CTRL_Type;
205 noLiteOpc_o : OUT STD_LOGIC
211 DW_g : POSITIVE := 32;
212 LW_g : POSITIVE := 15
215 in1 : IN STD_LOGIC_VECTOR (DW_g-1 DOWNTO 0);
216 in2 : IN STD_LOGIC_VECTOR (DW_g-1 DOWNTO 0);
218 sum : OUT STD_LOGIC_VECTOR (DW_g-1 DOWNTO 0);
225 USE_HW_MUL_g : BOOLEAN := FALSE;
226 USE_BARREL_g : BOOLEAN := FALSE
229 ID2EX_i : IN ID2EX_Type;
230 GPRF2EX_i : IN GPRF2EX_Type;
231 EX2IF_o : OUT EX2IF_Type;
232 HALT_o : OUT HALT_Type;
234 EX_WRB_i : IN WRB_Type;
235 EX_WRB_o : OUT WRB_Type;
236 MEM_WRB_i : IN WRB_Type;
238 HAZARD_WRB_i : IN HAZARD_WRB_Type;
239 HAZARD_WRB_o : OUT HAZARD_WRB_Type;
241 IMM_LOCK_i : IN IMM_LOCK_Type;
242 IMM_LOCK_o : OUT IMM_LOCK_Type;
245 MSR_o : OUT MSR_Type;
247 EX2MEM_o : OUT EX2MEM_Type
253 EX2MEM_i : IN EX2MEM_Type;
255 DMEMB_i : IN DMEMB2CORE_Type;
256 DMEMB_o : OUT CORE2DMEMB_Type;
258 MEM_REG_i : IN MEM_REG_Type;
259 MEM_REG_o : OUT MEM_REG_Type;
261 MEM_WRB_o : OUT WRB_Type;
262 MEM2CTRL_o : OUT MEM2CTRL_Type
266 COMPONENT core_ctrl IS
268 COMPATIBILITY_MODE_g : BOOLEAN := FALSE
271 clk_i : IN STD_LOGIC;
272 rst_i : IN STD_LOGIC;
273 halt_i : IN STD_LOGIC;
274 bad_op_i : IN STD_LOGIC;
275 int_i : IN STD_LOGIC;
276 trace_i : IN STD_LOGIC;
277 trace_kick_i : IN STD_LOGIC;
278 core_clken_o : OUT STD_LOGIC;
279 -- specific fetch i/o
280 imem_addr_o : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
281 imem_clken_o : OUT STD_LOGIC;
282 pc_ctrl_o : OUT STD_LOGIC;
283 -- fetch to decode pipeline registers
284 IF2ID_REG_i : IN IF2ID_Type;
285 IF2ID_REG_o : OUT IF2ID_Type;
286 -- decode to exeq pipeline registers
287 ID2EX_REG_i : IN ID2EX_Type;
288 ID2EX_REG_o : OUT ID2EX_Type;
290 gprf_clken_o : OUT STD_LOGIC;
291 -- exeq to fetch feedback registers
292 EX2IF_REG_i : IN EX2IF_Type;
293 EX2IF_REG_o : OUT EX2IF_Type;
294 -- exeq to core (halting)
295 exeq_halt_i : IN STD_LOGIC;
296 -- exeq to mem pipeline registers
297 EX2MEM_REG_i : IN EX2MEM_Type;
298 EX2MEM_REG_o : OUT EX2MEM_Type;
299 -- mem pipeline register
300 MEM_REG_i : IN MEM_REG_Type;
301 MEM_REG_o : OUT MEM_REG_Type;
302 -- decode control i/o
303 ID2CTRL_i : IN ID2CTRL_Type;
304 INT_CTRL_o : OUT INT_CTRL_Type;
306 EX_WRB_i : IN WRB_Type;
307 EX_WRB_o : OUT WRB_Type;
309 HAZARD_WRB_i : IN HAZARD_WRB_Type;
310 HAZARD_WRB_o : OUT HAZARD_WRB_Type;
311 -- for handling the 'IMM' instruction
312 IMM_LOCK_i : IN IMM_LOCK_Type;
313 IMM_LOCK_o : OUT IMM_LOCK_Type;
314 -- for handling the Machine Status Register
316 MSR_o : OUT MSR_Type;
318 MEM2CTRL_i : IN MEM2CTRL_Type
322 ----------------------------------------------------------------------------------------------
323 -- FUNCTION, PROCEDURE DECLARATIONS
324 ----------------------------------------------------------------------------------------------
326 PROCEDURE ep_add32 ( a, b : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
328 VARIABLE s : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
329 VARIABLE co : OUT STD_LOGIC );
331 PROCEDURE ep_add32nc ( a, b : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
333 VARIABLE s : OUT STD_LOGIC_VECTOR (31 DOWNTO 0));
335 -- PROCEDURE ep_add32 ( a, b : IN STD_LOGIC_VECTOR; ci : IN STD_LOGIC;
336 -- VARIABLE s : OUT STD_LOGIC_VECTOR;
337 -- VARIABLE co : OUT STD_LOGIC );
339 FUNCTION ef_nbits ( value : NATURAL ) RETURN POSITIVE;
344 ----------------------------------------------------------
345 PACKAGE BODY mbl_Pkg IS
346 ----------------------------------------------------------
348 PROCEDURE ep_add32 ( a, b : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
350 VARIABLE s : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
351 VARIABLE co : OUT STD_LOGIC ) IS
353 CONSTANT NBITS_LO_c : POSITIVE := 17;
354 CONSTANT NBITS_HI_c : POSITIVE := 32 -NBITS_LO_c;
355 VARIABLE tmp_lo_v : STD_LOGIC_VECTOR (NBITS_LO_c +1 DOWNTO 0);
356 VARIABLE tmp_hi0_v : STD_LOGIC_VECTOR (NBITS_HI_c +1 DOWNTO 0);
357 VARIABLE tmp_hi1_v : STD_LOGIC_VECTOR (NBITS_HI_c +1 DOWNTO 0);
359 tmp_lo_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(NBITS_LO_c -1 DOWNTO 0) & '1' ) +
360 UNSIGNED( '0' & b(NBITS_LO_c -1 DOWNTO 0) & ci ));
361 tmp_hi0_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(31 DOWNTO (32 - NBITS_HI_c)) & '1') +
362 UNSIGNED( '0' & b(31 DOWNTO (32 - NBITS_HI_c)) & '0'));
363 tmp_hi1_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(31 DOWNTO (32 - NBITS_HI_c)) & '1') +
364 UNSIGNED( '0' & b(31 DOWNTO (32 - NBITS_HI_c)) & '1'));
365 IF (tmp_lo_v(NBITS_LO_c +1) = '0') THEN
366 s := tmp_hi0_v(NBITS_HI_c DOWNTO 1) & tmp_lo_v(NBITS_LO_c DOWNTO 1);
367 co := tmp_hi0_v(NBITS_HI_c +1);
369 s := tmp_hi1_v(NBITS_HI_c DOWNTO 1) & tmp_lo_v(NBITS_LO_c DOWNTO 1);
370 co := tmp_hi1_v(NBITS_HI_c +1);
374 PROCEDURE ep_add32nc ( a, b : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
376 VARIABLE s : OUT STD_LOGIC_VECTOR (31 DOWNTO 0) ) IS
378 CONSTANT NBITS_LO_c : POSITIVE := 17;
379 CONSTANT NBITS_HI_c : POSITIVE := 32 -NBITS_LO_c;
380 VARIABLE tmp_lo_v : STD_LOGIC_VECTOR (NBITS_LO_c +1 DOWNTO 0);
381 VARIABLE tmp_hi0_v : STD_LOGIC_VECTOR (NBITS_HI_c +1 DOWNTO 0);
382 VARIABLE tmp_hi1_v : STD_LOGIC_VECTOR (NBITS_HI_c +1 DOWNTO 0);
384 tmp_lo_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(NBITS_LO_c -1 DOWNTO 0) & '1' ) +
385 UNSIGNED( '0' & b(NBITS_LO_c -1 DOWNTO 0) & ci ));
386 tmp_hi0_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(31 DOWNTO (32 - NBITS_HI_c)) & '1') +
387 UNSIGNED( '0' & b(31 DOWNTO (32 - NBITS_HI_c)) & '0'));
388 tmp_hi1_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(31 DOWNTO (32 - NBITS_HI_c)) & '1') +
389 UNSIGNED( '0' & b(31 DOWNTO (32 - NBITS_HI_c)) & '1'));
390 IF (tmp_lo_v(NBITS_LO_c +1) = '0') THEN
391 s := tmp_hi0_v(NBITS_HI_c DOWNTO 1) & tmp_lo_v(NBITS_LO_c DOWNTO 1);
393 s := tmp_hi1_v(NBITS_HI_c DOWNTO 1) & tmp_lo_v(NBITS_LO_c DOWNTO 1);
397 -- PROCEDURE ep_add32 ( a, b : IN STD_LOGIC_VECTOR; ci : IN STD_LOGIC;
398 -- VARIABLE s : OUT STD_LOGIC_VECTOR;
399 -- VARIABLE co : OUT STD_LOGIC ) IS
400 -- VARIABLE tmp_lo_v : STD_LOGIC_VECTOR (a'LENGTH/2 +1 DOWNTO 0);
401 -- VARIABLE tmp_hi0_v : STD_LOGIC_VECTOR (a'LENGTH/2 +1 DOWNTO 0);
402 -- VARIABLE tmp_hi1_v : STD_LOGIC_VECTOR (a'LENGTH/2 +1 DOWNTO 0);
404 -- tmp_lo_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(a'LENGTH/2 -1 DOWNTO 0) & '1' ) +
405 -- UNSIGNED( '0' & b(a'LENGTH/2 -1 DOWNTO 0) & ci ));
406 -- tmp_hi0_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(a'LENGTH -1 DOWNTO a'LENGTH/2) & '1') +
407 -- UNSIGNED( '0' & b(a'LENGTH -1 DOWNTO a'LENGTH/2) & '0'));
408 -- tmp_hi1_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(a'LENGTH -1 DOWNTO a'LENGTH/2) & '1') +
409 -- UNSIGNED( '0' & b(a'LENGTH -1 DOWNTO a'LENGTH/2) & '1'));
410 -- IF (tmp_lo_v(a'LENGTH/2 +1) = '0') THEN
411 -- s := tmp_hi0_v(a'LENGTH/2 DOWNTO 1) & tmp_lo_v(a'LENGTH/2 DOWNTO 1);
412 -- co := tmp_hi0_v(a'LENGTH/2 +1);
414 -- s := tmp_hi1_v(a'LENGTH/2 DOWNTO 1) & tmp_lo_v(a'LENGTH/2 DOWNTO 1);
415 -- co := tmp_hi1_v(a'LENGTH/2 +1);
419 -- Function ef_nbits returns the minimum number of binary bits to represent
421 -- so N = 0,1 NBITS = 1
423 -- N = 4,5,6,7 NBITS = 3
424 -- N = 8..15 NBITS = 4
425 -- N = 16..31 NBITS = 5
428 FUNCTION ef_nbits( value : NATURAL ) RETURN POSITIVE IS
429 VARIABLE temp_v : POSITIVE;
432 FOR i IN 1 TO INTEGER'HIGH LOOP
434 IF (temp_v > value) THEN
441 END PACKAGE BODY mbl_Pkg;