借助RocketChip快速获取Verilog代码(1)-LiteX社区-FPGA CPLD-ChipDebug

借助RocketChip快速获取Verilog代码(1)

借助RocketChip快速获取Verilog代码(1)

前情提要,本内容假设你已经初步了解了Chisel HDL编程语言

一、什么是RocketChip

RocketChip是一个开源的、可扩展的、使用Chisel硬件构建语言设计的System-on-a-chip(SoC)生成器。它提供了一种快速生成定制的SoC设计的方法,包括处理器核心、高速总线、内存接口等。

RocketChip还提供了一组现成的IP核,包括Rocket处理器核心、Cache、内存接口等,用户可以根据自己的需求进行定制。RocketChip的设计灵活,可扩展性强,适用于各种嵌入式系统设计需求。

总而言之,RocketChip是由美国伯克利大学提供的一个开源的HDL代码仓库,由于其主要用于构建一个SoC,而构建一个SoC通常会包含许多我们常用的IP模块,例如FIFO、AXICrossbar、计数器等,所以如果我们需要使用某些RTL代码模块的话,可以借助该仓库来生成Verilog代码,以在常规的RTL工程中使用

注意RocketChip的模块虽然是使用Chisel HDL语言编写,但是其经过了一些流片的考验,大部分IP的功能性应该是足够有保障的,作为日常功能模块使用应该绰绰有余。

二、包含的IP介绍

首先下载仓库:

git clone https://gitee.com/xlgforever/diplomacy_final.git
git submodule update --init --recursive

等待上述命令初始化完成,即可完成RocketChip仓库测试环境的下载。

RocketChip的官方网站为:https://github.com/chipsalliance/rocket-chip,这里直接提供了将官方仓库作为子仓库以进行Verilog代码生成的仓库。

打开diplomacy_final/rocket-chip/src/main/scala的文件夹,本文主要介绍其中以下几个需要用到的文件夹:

  • • amba该目录包含使用diplomacy来生成AMBA总线协议的代码,包含AXI4、AHB-lite、APB;
  • • diplomacy:这是伯克利大学的一个博士生的毕业课题,作用是设计了一套先协商,后生成硬件实现代码的系统;例如,假设一个AXICrossbar(这里的crossbar指的就是类似于Vivado IP库中的AXI Interconnect IP),其上游是两个AXI Master模块,下游是三个AXI Slave模块,中间通过AXI Crossbar连接;作为一种灵活的HDL语言, 在生成最终的erilog代码之前,首先这些模块需要进行参数协商,包括数据位宽是否匹配、三个Slave模块在总线上的地址范围等;协商完成之后,再最终生成最后的Verilog代码;具体的机制十分复杂,感兴趣的可以自行研究;
  • • util:包含了一些常用的IP核的Chisel实现,例如FIFO等;
    • • Arbiters.scala:包含了一些仲裁器;由于CPU中通常有多个核访问同一个共享资源的情况,因此需要仲裁器来调度和协调多个CPU对该共享资源的访问;例如其中的InOrderArbiter就实现了按照请求的顺序依次处理每个请求的功能。
    • • AsyncQueue.scala:包含了异步的FIFOAsyncQueue
    • • AsyncResetReg.scala:包含了异步复位的寄存器AsyncResetReg及其变体;
    • • BarrelShifter.scala:包含了桶型移位寄存器;
    • • ClockDivider.scala:包含了时钟分频器,支持进行2的幂次方的分频;
    • • MultiLanQueue.scala:包含了MultiLaneFIFO,即多个Lane的FIFO;
    • • MultiPortQueue.scala:即多端口的FIFO;
    • • MultiWidthFifo.scala:即输入和输出宽度不同的FIFO;
    • • ReorderQueue.scala:支持重排序的FIFO;
    • • ROMGeneratoer.scala:ROM生成器;

Chisel本身就具有一些强大的IP库,RocketChip只是在其基础之上进行了扩展,Chisel本身具有的IP库生成Verilog代码的过程与本教程的一致。

RocketChip除了上述IP库还有很多其他的IP库,例如CPU的Cache、用于RISC-V CPU的、具有缓存一致性功能的TileLink协议总线等。

三、Chisel环境安装

为了后续进行实验的方便,首先进行Chisel环境的安装:

sudo apt-get -y install default-jdk build-essential perl

# 安装SBT
sudo apt-get install apt-transport-https curl gnupg -yqq
echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | sudo tee /etc/apt/sources.list.d/sbt.list
echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | sudo tee /etc/apt/sources.list.d/sbt_old.list
curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | sudo -H gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/scalasbt-release.gpg --import
sudo chmod 644 /etc/apt/trusted.gpg.d/scalasbt-release.gpg
sudo apt-get update
sudo apt-get install sbt

实际上主要是安装了java和sbt。

后续我们将以MultiWidthFifo.scala为例,生成Verilog代码并进行初步的仿真。