Fixes reported by Joe Stoy: PLIC, MMIO_AXI4_Adapter and Core.bsv (details below)
PLIC: updated to latest version from Piccolo/Flute.
MMIO_AXI4_Adapter: added workaround for Xilinx IP problem on 64-bit
AXI4 fabrics. Writes that specify 8-byte size, but only write in
upper or lower word using strobes, are converted into 4-byte size.
Core.bsv: added a notification to the Debug Module re. CPU halt.
This commit is contained in:
@@ -1216,7 +1216,8 @@ module mkCore#(CoreId coreId)(Core);
|
||||
&& (f_run_halt_reqs.first == False));
|
||||
f_run_halt_reqs.deq;
|
||||
|
||||
// Ignore this.
|
||||
// Notify debugger that we're halted, but otherwise ignore the request
|
||||
f_run_halt_rsps.enq (False);
|
||||
|
||||
if (show_DM_interactions)
|
||||
$display ("%0d: %m.rl_debug_halt_req_already_halted", cur_cycle);
|
||||
|
||||
@@ -125,6 +125,21 @@ module mkMMIO_AXI4_Adapter (MMIO_AXI4_Adapter_IFC);
|
||||
wlast: True,
|
||||
wuser: fabric_default_user};
|
||||
|
||||
`ifdef FABRIC64
|
||||
// Work-around for a misbehavior on Xilinx UART and its
|
||||
// Xilinx AXI4 adapter. On 64-bit fabrics, for a write where
|
||||
// axsize says '8 bytes' but wstrb is for <= 4 bytes, the
|
||||
// adapter converts it two 32-bit writes, one of which has
|
||||
// wstrb=4'b0000. The Xilinx UART, in turn ignores wstrb and
|
||||
// therefore performs a spurious write. This workaround
|
||||
// changes axsize for such writes to '4 bytes', avoiding this
|
||||
// problem.
|
||||
|
||||
if (strb [7:4] == 0 || strb [3:0] == 0) begin
|
||||
mem_req_wr_addr.awsize = axsize_4;
|
||||
end
|
||||
`endif
|
||||
|
||||
master_xactor.i_wr_addr.enq (mem_req_wr_addr);
|
||||
master_xactor.i_wr_data.enq (mem_req_wr_data);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2019 Bluespec, Inc. All Rights Reserved
|
||||
// Copyright (c) 2019-2020 Bluespec, Inc. All Rights Reserved
|
||||
|
||||
package PLIC;
|
||||
|
||||
@@ -102,6 +102,7 @@ module mkPLIC (PLIC_IFC #(t_n_external_sources, t_n_targets, t_max_priority))
|
||||
Add #(_any_1, TLog #(t_n_targets), T_wd_target_id),
|
||||
Log #(TAdd #(t_max_priority, 1), t_wd_priority));
|
||||
|
||||
// 0 = quiet; 1 = show PLIC transactions; 2 = also show AXI4 transactions
|
||||
Reg #(Bit #(4)) cfg_verbosity <- mkConfigReg (0);
|
||||
|
||||
// Source_Ids and Priorities are read and written over the memory interface
|
||||
@@ -551,12 +552,12 @@ module mkPLIC (PLIC_IFC #(t_n_external_sources, t_n_targets, t_max_priority))
|
||||
return interface PLIC_Source_IFC;
|
||||
method Action m_interrupt_req (Bool set_not_clear);
|
||||
action
|
||||
if (! vrg_source_busy [source_id]) begin
|
||||
vrg_source_ip [source_id] <= set_not_clear;
|
||||
if (! vrg_source_busy [source_id + 1]) begin
|
||||
vrg_source_ip [source_id + 1] <= set_not_clear;
|
||||
|
||||
if ((cfg_verbosity > 0) && (vrg_source_ip [source_id] != set_not_clear))
|
||||
$display ("%0d: Changing vrg_source_ip [%0d] to %0d",
|
||||
cur_cycle, source_id, pack (set_not_clear));
|
||||
if ((cfg_verbosity > 0) && (vrg_source_ip [source_id + 1] != set_not_clear))
|
||||
$display ("%0d: %m.m_interrupt_req: changing vrg_source_ip [%0d] to %0d",
|
||||
cur_cycle, source_id + 1, pack (set_not_clear));
|
||||
end
|
||||
endaction
|
||||
endmethod
|
||||
|
||||
@@ -1,4 +1,29 @@
|
||||
The (relative) Memory map for this PLIC follows the one given in:
|
||||
// Copyright (c) 2019-2020 Bluespec, Inc. All Rights Reserved
|
||||
|
||||
>================================================================
|
||||
Our BSV PLIC here follows the example of the SiFive PLIC spec
|
||||
described below ("Background"), in order to be able to use the same
|
||||
Linux driver.
|
||||
|
||||
>================================================================
|
||||
Background on PLIC ("Platform Level Interrupt Controller")
|
||||
|
||||
As of this writing (2019-04-29), there is not yet any official PLIC
|
||||
spec for RISC-V.
|
||||
|
||||
In an earlier version (v1.10) of the RISC-V Privilege Architecture
|
||||
spec, Chapter 7 was a PLIC spec, but it was taken out of the Priv Arch
|
||||
spec to be considered separately in the future as part of a platform
|
||||
spec rather than as part of the ISA spec. That chapter spec was
|
||||
partial in that, while it described the required functionality, it did
|
||||
not specify any specific address map for the functional components.
|
||||
|
||||
SiFive has implemented that PLIC spec for their cores, taking
|
||||
particular decisions for memory mappings, etc., and they have
|
||||
implemented a Linux driver for it.
|
||||
|
||||
Below is a summary of their (relative) Memory map for the PLIC the
|
||||
following SiFive chip:
|
||||
|
||||
SiFive U54-MC Core Complex Manual, v1p0, Oct 4 2017
|
||||
Chapter 8 Platform Level Interrupt Controller, pp.32-38.
|
||||
@@ -27,7 +52,7 @@ IP (Interrupt Pending) array: 32 sources per 32b word
|
||||
>----------------
|
||||
Reserved
|
||||
|
||||
0x1018 ... 0x1FFF
|
||||
0x1040 ... 0x1FFF
|
||||
|
||||
>----------------
|
||||
IE (interrupt enables) array for Hart0 M mode (1 bit per source)
|
||||
@@ -105,30 +130,32 @@ Reserved
|
||||
>----------------
|
||||
Threshold (of priority) and Claim/Complete registers
|
||||
|
||||
0x0C20 0000 Hart 0 M-mode
|
||||
0x0C20 0004 Hart 0 M-mode claim/complete
|
||||
0x0020 0000 Hart 0 M-mode
|
||||
0x0020 0004 Hart 0 M-mode claim/complete
|
||||
>----------------
|
||||
0x0C20 1000 Hart 1 M-mode
|
||||
0x0C20 1004 Hart 1 M-mode claim/complete
|
||||
0x0020 1000 Hart 1 M-mode
|
||||
0x0020 1004 Hart 1 M-mode claim/complete
|
||||
>----------------
|
||||
0x0C20 2000 Hart 1 S-mode
|
||||
0x0C20 2004 Hart 1 S-mode claim/complete
|
||||
0x0020 2000 Hart 1 S-mode
|
||||
0x0020 2004 Hart 1 S-mode claim/complete
|
||||
>----------------
|
||||
0x0C20 3000 Hart 2 M-mode
|
||||
0x0C20 3004 Hart 2 M-mode claim/complete
|
||||
0x0020 3000 Hart 2 M-mode
|
||||
0x0020 3004 Hart 2 M-mode claim/complete
|
||||
>----------------
|
||||
0x0C20 4000 Hart 2 S-mode
|
||||
0x0C20 4004 Hart 2 S-mode claim/complete
|
||||
0x0020 4000 Hart 2 S-mode
|
||||
0x0020 4004 Hart 2 S-mode claim/complete
|
||||
>----------------
|
||||
0x0C20 5000 Hart 3 M-mode
|
||||
0x0C20 5004 Hart 3 M-mode claim/complete
|
||||
0x0020 5000 Hart 3 M-mode
|
||||
0x0020 5004 Hart 3 M-mode claim/complete
|
||||
>----------------
|
||||
0x0C20 6000 Hart 3 S-mode
|
||||
0x0C20 6004 Hart 3 S-mode claim/complete
|
||||
0x0020 6000 Hart 3 S-mode
|
||||
0x0020 6004 Hart 3 S-mode claim/complete
|
||||
>----------------
|
||||
0x0C20 7000 Hart 4 M-mode
|
||||
0x0C20 7004 Hart 4 M-mode claim/complete
|
||||
0x0020 7000 Hart 4 M-mode
|
||||
0x0020 7004 Hart 4 M-mode claim/complete
|
||||
>----------------
|
||||
0x0C20 8000 Hart 4 S-mode
|
||||
0x0C20 8004 Hart 4 S-mode claim/complete
|
||||
0x0020 8000 Hart 4 S-mode
|
||||
0x0020 8004 Hart 4 S-mode claim/complete
|
||||
>----------------
|
||||
|
||||
>================================================================
|
||||
|
||||
Reference in New Issue
Block a user