cpu/naxriscv Add pythondata support

This commit is contained in:
Dolu1990 2022-02-17 14:59:56 +01:00
parent d0dc5c8d95
commit a3243e32ec
3 changed files with 110 additions and 55 deletions

View File

@ -1,46 +0,0 @@
module Ram_1w_1rs #(
parameter integer wordCount = 0,
parameter integer wordWidth = 0,
parameter clockCrossing = 1'b0,
parameter technology = "auto",
parameter readUnderWrite = "dontCare",
parameter integer wrAddressWidth = 0,
parameter integer wrDataWidth = 0,
parameter integer wrMaskWidth = 0,
parameter wrMaskEnable = 1'b0,
parameter integer rdAddressWidth = 0,
parameter integer rdDataWidth = 0
)(
input wr_clk,
input wr_en,
input [wrMaskWidth-1:0] wr_mask,
input [wrAddressWidth-1:0] wr_addr,
input [wrDataWidth-1:0] wr_data,
input rd_clk,
input rd_en,
input [rdAddressWidth-1:0] rd_addr,
output [rdDataWidth-1:0] rd_data
);
reg [wrDataWidth-1:0] ram_block [(2**wrAddressWidth)-1:0];
integer i;
localparam COL_WIDTH = wrDataWidth/wrMaskWidth;
always @ (posedge wr_clk) begin
if(wr_en) begin
for(i=0;i<wrMaskWidth;i=i+1) begin
if(wr_mask[i]) begin
ram_block[wr_addr][i*COL_WIDTH +: COL_WIDTH] <= wr_data[i*COL_WIDTH +:COL_WIDTH];
end
end
end
end
reg [rdDataWidth-1:0] ram_rd_data;
always @ (posedge rd_clk) begin
if(rd_en) begin
ram_rd_data <= ram_block[rd_addr];
end
end
assign rd_data = ram_rd_data;
endmodule

View File

@ -4,12 +4,14 @@
# Copyright (c) 2020-2022 Florent Kermarrec <florent@enjoy-digital.fr>
# Copyright (c) 2020-2022 Dolu1990 <charles.papon.90@gmail.com>
# SPDX-License-Identifier: BSD-2-Clause
import hashlib
import os
import subprocess
from os import path
from migen import *
from litex import get_data_mod
from litex.soc.interconnect import wishbone
from litex.soc.interconnect import axi
from litex.soc.interconnect.csr import *
@ -42,6 +44,9 @@ class NaxRiscv(CPU):
# Default parameters.
with_fpu = False
with_rvc = False
scala_files = ["misc.scala", "fetch.scala", "frontend.scala", "branch_predictor_std.scala", "lsu.scala", "eu_2alu_1share.scala"]
netlist_name = None
scala_paths = []
# ABI.
@staticmethod
@ -81,6 +86,20 @@ class NaxRiscv(CPU):
flags += f" -DUART_POLLING"
return flags
# Command line configuration arguments.
@staticmethod
def args_fill(parser):
cpu_group = parser.add_argument_group("cpu")
cpu_group.add_argument("--scala-file", action='append', help="Specify the scala files used to configure NaxRiscv")
@staticmethod
def args_read(args):
print(args)
if args.scala_file:
NaxRiscv.scala_files = args.scala_file
def __init__(self, platform, variant):
self.platform = platform
self.variant = "standard"
@ -140,14 +159,90 @@ class NaxRiscv(CPU):
self.reset_address = reset_address
assert reset_address == 0x00000000
@staticmethod
def find_scala_files():
vdir = get_data_mod("cpu", "naxriscv").data_location
for file in NaxRiscv.scala_files:
if os.path.exists(file):
NaxRiscv.scala_paths.append(os.path.abspath(file))
else:
path = os.path.join(vdir, "configs", file)
if os.path.exists(path):
NaxRiscv.scala_paths.append(path)
else:
raise Exception(f"Can't find NaxRiscv's {file}")
# Cluster Name Generation.
@staticmethod
def generate_netlist_name():
md5_hash = hashlib.md5()
for file in NaxRiscv.scala_paths:
a_file = open(file, "rb")
content = a_file.read()
md5_hash.update(content)
digest = md5_hash.hexdigest()
NaxRiscv.netlist_name = "NaxRiscvLitex_" + digest
@staticmethod
def git_setup(name, dir, repo, hash):
if not os.path.exists(dir):
# Clone Repo.
print(f"Cloning {name} Git repository...")
subprocess.check_call("git clone {url} {options}".format(
url = repo,
options = dir
), shell=True)
# Use specific SHA1 (Optional).
os.chdir(os.path.join(dir))
os.system(f"cd {dir} && git checkout {hash}")
# Netlist Generation.
@staticmethod
def generate_netlist():
vdir = get_data_mod("cpu", "naxriscv").data_location
ndir = os.path.join(vdir, "ext", "NaxRiscv")
sdir = os.path.join(vdir, "ext", "SpinalHDL")
# NaxRiscv.git_setup("NaxRiscv", ndir, "https://github.com/SpinalHDL/NaxRiscv.git", "c883e74e")
# NaxRiscv.git_setup("SpinalHDL", sdir, "https://github.com/SpinalHDL/SpinalHDL.git", "10cfe066")
gen_args = []
gen_args.append(f"--netlist-name={NaxRiscv.netlist_name}")
gen_args.append(f"--netlist-directory={vdir}")
for file in NaxRiscv.scala_paths:
gen_args.append(f"--scala-file={file}")
cmd = f"""cd {ndir} && sbt "runMain naxriscv.platform.LitexGen {" ".join(gen_args)}\""""
print("NaxRiscv generation command :")
print(cmd)
if os.system(cmd) != 0:
raise OSError('Failed to run sbt')
def add_sources(self, platform):
cdir = os.path.abspath(os.path.dirname(__file__))
# FIXME: Create pythondata-cpu-naxriscv once working.
if not os.path.exists(f"{cdir}/NaxRiscvLitex.v"):
os.system(f"wget https://github.com/enjoy-digital/litex_naxriscv_test/files/8059827/NaxRiscvLitex.v.txt -P {cdir}")
os.system(f"mv {cdir}/NaxRiscvLitex.v.txt {cdir}/NaxRiscvLitex.v")
platform.add_source(os.path.join(cdir, "NaxRiscvLitex.v"))
platform.add_source(os.path.join(cdir, "RamXilinx.v"))
vdir = get_data_mod("cpu", "naxriscv").data_location
print(f"NaxRiscv netlist : {self.netlist_name}")
if not path.exists(os.path.join(vdir, self.netlist_name + ".v")):
self.generate_netlist()
# Add RAM.
# By default, use Generic RAM implementation.
ram_filename = "Ram_1w_1rs_Generic.v"
# On Altera/Intel platforms, use specific implementation.
from litex.build.altera import AlteraPlatform
if isinstance(platform, AlteraPlatform):
ram_filename = "Ram_1w_1rs_Intel.v"
# On Efinix platforms, use specific implementation.
from litex.build.efinix import EfinixPlatform
if isinstance(platform, EfinixPlatform):
ram_filename = "Ram_1w_1rs_Efinix.v"
platform.add_source(os.path.join(vdir, ram_filename), "verilog")
# Add Cluster.
platform.add_source(os.path.join(vdir, self.netlist_name + ".v"), "verilog")
def add_soc_components(self, soc, soc_region_cls):
soc.csr.add("uart", n=2)
@ -272,8 +367,13 @@ class NaxRiscv(CPU):
def do_finalize(self):
assert hasattr(self, "reset_address")
self.find_scala_files()
self.generate_netlist_name()
# Do verilog instance.
self.specials += Instance("NaxRiscvLitex", **self.cpu_params)
self.specials += Instance(self.netlist_name, **self.cpu_params)
# Add verilog sources
self.add_sources(self.platform)

View File

@ -99,6 +99,7 @@ git_repos = {
"pythondata-cpu-serv": GitRepo(url="https://github.com/litex-hub/"),
"pythondata-cpu-vexriscv": GitRepo(url="https://github.com/litex-hub/"),
"pythondata-cpu-vexriscv-smp": GitRepo(url="https://github.com/litex-hub/", clone="recursive"),
"pythondata-cpu-naxriscv": GitRepo(url="https://github.com/litex-hub/"),
"pythondata-cpu-rocket": GitRepo(url="https://github.com/litex-hub/"),
"pythondata-cpu-minerva": GitRepo(url="https://github.com/litex-hub/"),
"pythondata-cpu-microwatt": GitRepo(url="https://github.com/litex-hub/", sha1=0xb940b55acff),