@@ -18,8 +18,10 @@ use neorv32.neorv32_package.all;
18
18
19
19
entity neorv32_tb is
20
20
generic (
21
+ -- processor --
21
22
CLOCK_FREQUENCY : natural := 100_000_000 ; -- clock frequency of clk_i in Hz
22
23
BOOT_MODE_SELECT : natural range 0 to 2 := 2 ; -- boot from pre-initialized IMEM
24
+ BOOT_ADDR_CUSTOM : std_ulogic_vector (31 downto 0 ) := x"00000000" ; -- custom CPU boot address (if boot_config = 1)
23
25
RISCV_ISA_C : boolean := false ; -- implement compressed extension
24
26
RISCV_ISA_E : boolean := false ; -- implement embedded RF extension
25
27
RISCV_ISA_M : boolean := true ; -- implement mul/div extension
@@ -54,7 +56,17 @@ entity neorv32_tb is
54
56
ICACHE_BLOCK_SIZE : natural range 4 to 2 ** 16 := 32 ; -- i-cache: block size in bytes (min 4), has to be a power of 2
55
57
DCACHE_EN : boolean := true ; -- implement data cache
56
58
DCACHE_NUM_BLOCKS : natural range 1 to 256 := 32 ; -- d-cache: number of blocks (min 1), has to be a power of 2
57
- DCACHE_BLOCK_SIZE : natural range 4 to 2 ** 16 := 32 -- d-cache: block size in bytes (min 4), has to be a power of 2
59
+ DCACHE_BLOCK_SIZE : natural range 4 to 2 ** 16 := 32 ; -- d-cache: block size in bytes (min 4), has to be a power of 2
60
+ -- external memory A --
61
+ EXT_MEM_A_EN : boolean := false ; -- enable memory
62
+ EXT_MEM_A_BASE : std_ulogic_vector (31 downto 0 ) := x"00000000" ; -- base address, has to be word-aligned
63
+ EXT_MEM_A_SIZE : natural := 64 ; -- memory size in bytes, min 4
64
+ EXT_MEM_A_FILE : string := " " ; -- memory initialization file (plain HEX), no initialization if empty
65
+ -- external memory B --
66
+ EXT_MEM_B_EN : boolean := false ; -- enable memory
67
+ EXT_MEM_B_BASE : std_ulogic_vector (31 downto 0 ) := x"80000000" ; -- base address, has to be word-aligned
68
+ EXT_MEM_B_SIZE : natural := 64 ; -- memory size in bytes, min 4
69
+ EXT_MEM_B_FILE : string := " " -- memory initialization file (plain HEX), no initialization if empty
58
70
);
59
71
end neorv32_tb ;
60
72
@@ -79,8 +91,8 @@ architecture neorv32_tb_rtl of neorv32_tb is
79
91
signal slink_tx, slink_rx : slink_t;
80
92
81
93
-- XBUS (Wishbone b4) bus --
82
- signal xbus_core_req, xbus_imem_req, xbus_dmem_req , xbus_mmio_req, xbus_trig_req : xbus_req_t;
83
- signal xbus_core_rsp, xbus_imem_rsp, xbus_dmem_rsp , xbus_mmio_rsp, xbus_trig_rsp : xbus_rsp_t;
94
+ signal xbus_core_req, xbus_ext_mem_a_req, xbus_ext_mem_b_req , xbus_mmio_req, xbus_trig_req : xbus_req_t;
95
+ signal xbus_core_rsp, xbus_ext_mem_a_rsp, xbus_ext_mem_b_rsp , xbus_mmio_rsp, xbus_trig_rsp : xbus_rsp_t;
84
96
85
97
begin
86
98
@@ -102,7 +114,7 @@ begin
102
114
JEDEC_ID => "00000000000" ,
103
115
-- Boot Configuration --
104
116
BOOT_MODE_SELECT => BOOT_MODE_SELECT,
105
- BOOT_ADDR_CUSTOM => x"00000000" ,
117
+ BOOT_ADDR_CUSTOM => BOOT_ADDR_CUSTOM ,
106
118
-- On-Chip Debugger (OCD) --
107
119
OCD_EN => true ,
108
120
OCD_AUTHENTICATION => true ,
@@ -142,7 +154,7 @@ begin
142
154
HPM_NUM_CNTS => 12 ,
143
155
HPM_CNT_WIDTH => 40 ,
144
156
-- Internal Instruction memory --
145
- MEM_INT_IMEM_EN => MEM_INT_IMEM_EN ,
157
+ MEM_INT_IMEM_EN => MEM_INT_IMEM_EN,
146
158
MEM_INT_IMEM_SIZE => MEM_INT_IMEM_SIZE,
147
159
-- Internal Data memory --
148
160
MEM_INT_DMEM_EN => MEM_INT_DMEM_EN,
@@ -352,9 +364,9 @@ begin
352
364
-- -------------------------------------------------------------------------------------------
353
365
sim_rx_uart0 : entity work .sim_uart_rx
354
366
generic map (
355
- name => " uart0" ,
356
- fclk => real (CLOCK_FREQUENCY),
357
- baud => real (19200 )
367
+ NAME => " uart0" ,
368
+ FCLK => real (CLOCK_FREQUENCY),
369
+ BAUD => real (19200 )
358
370
)
359
371
port map (
360
372
clk => clk_gen,
@@ -363,9 +375,9 @@ begin
363
375
364
376
sim_rx_uart1 : entity work .sim_uart_rx
365
377
generic map (
366
- name => " uart1" ,
367
- fclk => real (CLOCK_FREQUENCY),
368
- baud => real (19200 )
378
+ NAME => " uart1" ,
379
+ FCLK => real (CLOCK_FREQUENCY),
380
+ BAUD => real (19200 )
369
381
)
370
382
port map (
371
383
clk => clk_gen,
@@ -378,59 +390,78 @@ begin
378
390
xbus_interconnect : entity work .xbus_gateway
379
391
generic map (
380
392
-- device address size in bytes and base address --
381
- DEV_0_SIZE => MEM_INT_IMEM_SIZE , DEV_0_BASE => mem_imem_base_c ,
382
- DEV_1_SIZE => MEM_INT_DMEM_SIZE , DEV_1_BASE => mem_dmem_base_c ,
383
- DEV_2_SIZE => 64 , DEV_2_BASE => x"F0000000" ,
384
- DEV_3_SIZE => 4 , DEV_3_BASE => x"FF000000"
393
+ DEV_0_EN => EXT_MEM_A_EN, DEV_0_SIZE => EXT_MEM_A_SIZE , DEV_0_BASE => EXT_MEM_A_BASE ,
394
+ DEV_1_EN => EXT_MEM_B_EN, DEV_1_SIZE => EXT_MEM_B_SIZE , DEV_1_BASE => EXT_MEM_B_BASE ,
395
+ DEV_2_EN => true , DEV_2_SIZE => 64 , DEV_2_BASE => x"F0000000" ,
396
+ DEV_3_EN => true , DEV_3_SIZE => 4 , DEV_3_BASE => x"FF000000"
385
397
)
386
398
port map (
387
399
-- host port --
388
400
host_req_i => xbus_core_req,
389
401
host_rsp_o => xbus_core_rsp,
390
402
-- device ports --
391
- dev_0_req_o => xbus_imem_req , dev_0_rsp_i => xbus_imem_rsp ,
392
- dev_1_req_o => xbus_dmem_req , dev_1_rsp_i => xbus_dmem_rsp ,
393
- dev_2_req_o => xbus_mmio_req, dev_2_rsp_i => xbus_mmio_rsp,
394
- dev_3_req_o => xbus_trig_req, dev_3_rsp_i => xbus_trig_rsp
403
+ dev_0_req_o => xbus_ext_mem_a_req , dev_0_rsp_i => xbus_ext_mem_a_rsp ,
404
+ dev_1_req_o => xbus_ext_mem_b_req , dev_1_rsp_i => xbus_ext_mem_b_rsp ,
405
+ dev_2_req_o => xbus_mmio_req, dev_2_rsp_i => xbus_mmio_rsp,
406
+ dev_3_req_o => xbus_trig_req, dev_3_rsp_i => xbus_trig_rsp
395
407
);
396
408
397
409
398
- -- XBUS: Instruction Memory ---------------------------------------------------------------
410
+ -- XBUS: External Memory A - ---------------------------------------------------------------
399
411
-- -------------------------------------------------------------------------------------------
400
- xbus_imem : entity work .xbus_memory
401
- generic map (
402
- MEM_SIZE => MEM_INT_IMEM_SIZE,
403
- MEM_LATE => 1
404
- )
405
- port map (
406
- clk_i => clk_gen,
407
- rstn_i => rst_gen,
408
- xbus_req_i => xbus_imem_req,
409
- xbus_rsp_o => xbus_imem_rsp
410
- );
411
-
412
-
413
- -- XBUS: Data Memory ----------------------------------------------------------------------
412
+ xbus_external_memory_a_enable:
413
+ if EXT_MEM_A_EN generate
414
+ xbus_external_memory_a : entity work .xbus_memory
415
+ generic map (
416
+ MEM_SIZE => EXT_MEM_A_SIZE,
417
+ MEM_LATE => 1 ,
418
+ MEM_FILE => EXT_MEM_A_FILE
419
+ )
420
+ port map (
421
+ clk_i => clk_gen,
422
+ rstn_i => rst_gen,
423
+ xbus_req_i => xbus_ext_mem_a_req,
424
+ xbus_rsp_o => xbus_ext_mem_a_rsp
425
+ );
426
+ end generate ;
427
+
428
+ xbus_external_memory_a_disable:
429
+ if not EXT_MEM_A_EN generate
430
+ xbus_ext_mem_a_rsp <= xbus_rsp_terminate_c;
431
+ end generate ;
432
+
433
+
434
+ -- XBUS: External Memory B ----------------------------------------------------------------
414
435
-- -------------------------------------------------------------------------------------------
415
- xbus_dmem : entity work .xbus_memory
416
- generic map (
417
- MEM_SIZE => MEM_INT_DMEM_SIZE,
418
- MEM_LATE => 1
419
- )
420
- port map (
421
- clk_i => clk_gen,
422
- rstn_i => rst_gen,
423
- xbus_req_i => xbus_dmem_req,
424
- xbus_rsp_o => xbus_dmem_rsp
425
- );
436
+ xbus_external_memory_b_enable:
437
+ if EXT_MEM_B_EN generate
438
+ xbus_external_memory_b : entity work .xbus_memory
439
+ generic map (
440
+ MEM_SIZE => EXT_MEM_B_SIZE,
441
+ MEM_LATE => 1 ,
442
+ MEM_FILE => EXT_MEM_B_FILE
443
+ )
444
+ port map (
445
+ clk_i => clk_gen,
446
+ rstn_i => rst_gen,
447
+ xbus_req_i => xbus_ext_mem_b_req,
448
+ xbus_rsp_o => xbus_ext_mem_b_rsp
449
+ );
450
+ end generate ;
451
+
452
+ xbus_external_memory_b_disable:
453
+ if not EXT_MEM_B_EN generate
454
+ xbus_ext_mem_b_rsp <= xbus_rsp_terminate_c;
455
+ end generate ;
426
456
427
457
428
458
-- XBUS: Memory-Mapped IO -----------------------------------------------------------------
429
459
-- -------------------------------------------------------------------------------------------
430
460
xbus_mmio : entity work .xbus_memory
431
461
generic map (
432
462
MEM_SIZE => 64 ,
433
- MEM_LATE => 32
463
+ MEM_LATE => 32 ,
464
+ MEM_FILE => " " -- no initialization
434
465
)
435
466
port map (
436
467
clk_i => clk_gen,
0 commit comments