Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions .idea/risc-v-boris-basic-execution-environment.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ Mihir Maringanti

Marwan Ismail (marwannismail)

Tony Zhu (RunzeZhu28)
Tony Zhu (RunzeZhu28)
130 changes: 65 additions & 65 deletions Dockerfile.riscv-toolchain
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,65 +1,65 @@
FROM public.ecr.aws/lts/ubuntu:22.04_stable AS builder
ARG DEBIAN_FRONTEND=noninteractive
ARG KEYRING_PATH=/usr/share/keyrings
ARG APT_SOURCES_PATH=/etc/apt/sources.list.d
# update and upgrade
RUN apt update && apt upgrade -y
# install essentialls
RUN apt update && \
apt install -y \
man make build-essential git zsh vim curl wget procps gnupg gnupg2 ca-certificates zip \
software-properties-common
# unminimize the system
RUN bash -c "yes | unminimize"
# create dev sudo user
RUN useradd --create-home dev && \
usermod --append --groups sudo dev && \
apt update && apt install -y sudo && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# build riscv toolchain
RUN sudo apt-get install -y \
autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk \
build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev && \
cd /tmp && \
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain.git && \
git clone --recursive https://github.com/riscv/riscv-opcodes.git && \
cd riscv-gnu-toolchain && \
./configure --prefix=/opt/riscv --with-arch=rv32i --with-abi=ilp32 && \
sudo make
# main image stage
FROM public.ecr.aws/lts/ubuntu:22.04_stable
ARG DEBIAN_FRONTEND=noninteractive
ARG KEYRING_PATH=/usr/share/keyrings
ARG APT_SOURCES_PATH=/etc/apt/sources.list.d
# update and upgrade
RUN apt update && apt upgrade -y
# install essentialls
RUN apt update && \
apt install -y \
man make build-essential git zsh vim curl wget procps gnupg gnupg2 ca-certificates zip \
software-properties-common
# unminimize the system
RUN bash -c "yes | unminimize"
# create dev sudo user
RUN useradd --create-home dev && \
usermod --append --groups sudo dev && \
apt update && apt install -y sudo && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# get toolchain artifacts from builder stage
COPY --from=builder /opt/riscv /opt/riscv
ENV PATH="/opt/riscv/bin:${PATH}"
USER dev
FROM public.ecr.aws/lts/ubuntu:22.04_stable AS builder

ARG DEBIAN_FRONTEND=noninteractive
ARG KEYRING_PATH=/usr/share/keyrings
ARG APT_SOURCES_PATH=/etc/apt/sources.list.d

# update and upgrade
RUN apt update && apt upgrade -y

# install essentialls
RUN apt update && \
apt install -y \
man make build-essential git zsh vim curl wget procps gnupg gnupg2 ca-certificates zip \
software-properties-common

# unminimize the system
RUN bash -c "yes | unminimize"

# create dev sudo user
RUN useradd --create-home dev && \
usermod --append --groups sudo dev && \
apt update && apt install -y sudo && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# build riscv toolchain
RUN sudo apt-get install -y \
autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk \
build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev && \
cd /tmp && \
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain.git && \
git clone --recursive https://github.com/riscv/riscv-opcodes.git && \
cd riscv-gnu-toolchain && \
./configure --prefix=/opt/riscv --with-arch=rv32i --with-abi=ilp32 && \
sudo make

# main image stage
FROM public.ecr.aws/lts/ubuntu:22.04_stable

ARG DEBIAN_FRONTEND=noninteractive
ARG KEYRING_PATH=/usr/share/keyrings
ARG APT_SOURCES_PATH=/etc/apt/sources.list.d

# update and upgrade
RUN apt update && apt upgrade -y

# install essentialls
RUN apt update && \
apt install -y \
man make build-essential git zsh vim curl wget procps gnupg gnupg2 ca-certificates zip \
software-properties-common

# unminimize the system
RUN bash -c "yes | unminimize"

# create dev sudo user
RUN useradd --create-home dev && \
usermod --append --groups sudo dev && \
apt update && apt install -y sudo && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# get toolchain artifacts from builder stage
COPY --from=builder /opt/riscv /opt/riscv
ENV PATH="/opt/riscv/bin:${PATH}"

USER dev
63 changes: 37 additions & 26 deletions envs/de1-soc/memory_map.sv
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ module memory_map #( parameter SIZE = 1024 )
, input data_t write_data
, input logic [3:0] write_enable
, output data_t read_data
, input logic [31:0] dbg_regs [0:31]
, input addr_t dbg_pc

, output reg [9:0] LEDR
);
Expand All @@ -26,36 +28,45 @@ module memory_map #( parameter SIZE = 1024 )
$readmemh("poc/poc3.mem", M3);
end
`endif
reg [31:0] mem_rdata;

reg [31:0] M [0:SIZE - 1];
reg [31:0] mem_rdata;
localparam bit [31:0] LEDR_ADDRESS = 32'h1000_0000;
localparam bit [31:0] DBG_REG_BASE = 32'h2000_0000; // x0..x31
localparam bit [31:0] DBG_PC_ADDR = 32'h2000_0080; // to see where is the current pc

localparam bit [31:0] LEDR_ADDRESS = 32'h10000000;
localparam int ADDR_LSB = 2;
localparam int ADDR_WIDTH = $clog2(SIZE);
wire [ADDR_WIDTH - 1 : 0] mem_index = address[ADDR_LSB + ADDR_WIDTH - 1 : ADDR_LSB];

localparam int ADDR_LSB = 2;
localparam int ADDR_WIDTH = $clog2(SIZE);
wire [ADDR_WIDTH - 1:0] mem_index = address[ADDR_LSB + ADDR_WIDTH - 1 : ADDR_LSB]; // I think this way may save some resources
wire dbg_reg_hit = (address[31:12] == DBG_REG_BASE[31:12]) && (address[11:7] == 5'd0); //between REG_BASE and use only 31 words
wire [4:0] dbg_reg_idx = address[6:2];

always @(*) begin
case (address)
LEDR_ADDRESS: read_data = {22'b0, LEDR};
default: read_data = mem_rdata;
endcase
end
always @(*) begin
case (address)
LEDR_ADDRESS: read_data = {22'b0, LEDR};
DBG_PC_ADDR: read_data = dbg_pc;
default: begin
if (dbg_reg_hit && (dbg_reg_idx < 5'd32)) read_data = dbg_regs[dbg_reg_idx];
else read_data = mem_rdata;
end
endcase
end

always @(posedge clk) begin
mem_rdata <= { M3[mem_index], M2[mem_index], M1[mem_index], M0[mem_index] };
case (address)
LEDR_ADDRESS: begin
if (|write_enable) LEDR <= write_data[9:0];
end
default: begin
if (write_enable[0]) M0[mem_index] <= write_data[7:0];
if (write_enable[1]) M1[mem_index] <= write_data[15:8];
if (write_enable[2]) M2[mem_index] <= write_data[23:16];
if (write_enable[3]) M3[mem_index] <= write_data[31:24];
end
endcase
end
always @(posedge clk) begin
mem_rdata <= { M3[mem_index], M2[mem_index], M1[mem_index], M0[mem_index] };

case (address)
LEDR_ADDRESS: begin
if (|write_enable) LEDR <= write_data[9:0];
end

default: begin
if (write_enable[0]) M0[mem_index] <= write_data[7:0];
if (write_enable[1]) M1[mem_index] <= write_data[15:8];
if (write_enable[2]) M2[mem_index] <= write_data[23:16];
if (write_enable[3]) M3[mem_index] <= write_data[31:24];
end
endcase
end

endmodule
44 changes: 44 additions & 0 deletions envs/de1-soc/memory_map.sv.bak
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
`include "src/types.svh"

module memory_map #( parameter SIZE = 1024 )
( input wire clk

, input addr_t address
, input data_t write_data
, input logic [3:0] write_enable
, output data_t read_data

, output reg [9:0] LEDR
);

reg [31:0] M[0:SIZE -1];

// need to run make in the poc directory before this command can succeed
initial $readmemh("poc/poc.mem", M);

localparam bit [31:0] LEDR_ADDRESS = 32'h10000000;

wire [31:0] mem_index = address[31:2] % SIZE;

always @(*) begin
case (address)
LEDR_ADDRESS: read_data = {22'b0, LEDR};
default: read_data = M[mem_index];
endcase
end

always @(posedge clk) begin
case (address)
LEDR_ADDRESS: begin
if (|write_enable) LEDR <= write_data[9:0];
end
default: begin
// this is not compliant with our write_enable mechanism, and essentially breaks the
// sub-word writing instructions (e.g. sb); however i could not get the per-byte writes on
// de1-soc for some reason
if (|write_enable) M[mem_index] <= write_data;
end
endcase
end

endmodule
2 changes: 1 addition & 1 deletion envs/de1-soc/poc/poc.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ int main(void) {
}

return 0;
}
}
6 changes: 6 additions & 0 deletions envs/de1-soc/poc/poc.mem.bak
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
@00000000
FE010113 00112E23 00812C23 02010413
FE042623 FEC42783 02A78793 FEF42623
FEC42783 01678793 FEF42623 100007B7
FEC42703 00E7A023 00000793 00078513
01C12083 01812403 02010113 00008067
20 changes: 20 additions & 0 deletions envs/de1-soc/poc/poc0.mem
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
13
23
23
23
13
93
93
93
B7
23
23
6F
83
93
23
03
B7
93
E3
6F
6 changes: 6 additions & 0 deletions envs/de1-soc/poc/poc0.mem.bak
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
@00000000
FE010113 00112E23 00812C23 02010413
FE042623 FEC42783 02A78793 FEF42623
FEC42783 01678793 FEF42623 100007B7
FEC42703 00E7A023 00000793 00078513
01C12083 01812403 02010113 00008067
20 changes: 20 additions & 0 deletions envs/de1-soc/poc/poc1.mem
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
01
2E
2C
2A
04
04
87
F4
07
A0
26
00
27
87
26
27
47
87
D4
F0
6 changes: 6 additions & 0 deletions envs/de1-soc/poc/poc1.mem.bak
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
@00000000
FE010113 00112E23 00812C23 02010413
FE042623 FEC42783 02A78793 FEF42623
FEC42783 01678793 FEF42623 100007B7
FEC42703 00E7A023 00000793 00078513
01C12083 01812403 02010113 00008067
20 changes: 20 additions & 0 deletions envs/de1-soc/poc/poc2.mem
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
01
11
81
91
01
00
14
F7
00
97
04
00
C4
17
F4
C4
0F
F7
E7
DF
Loading
Loading