使用RocketChip生成Verilog代码供外部工程使用

概述

Rocketchip中包含了许多常见的Verilog模块的Chisel实现,但是这些实现都深度的与Diplomacy绑定,不能简单的通过单独创建一个模块来生成其对应的Verilog代码。

以Rocket-chip中的AXI4Xbar为例,其实现如下图所示,其实现包含了AXI4NexusNode,而Node又实际上代表了该模块的IO端口和IO端口的参数(例如AXI4Xbar的AXI4NexusNode实际上包含了AXI4Bundle和该Bundle对应的Parameters),IO端口及其相关参数需要与上下游的模块的Node进行“协商”后才能最终确定,这一套机制称为Diplomacy。
在这里插入图片描述
因此,我们不能通过简单的实例化该模块来生成Verilog代码,而是需要搭建一套环境,为AXI4Xbar模块提供上下游的模块的node,才能协商生成最终的代码。

确定参数

AXI4 Master端口的参数

Rocketchip提供了样例类(case class)来生成对应的参数;AXI4 Master端口的参数如下图所示,其中,影响最终生成的信号的参数仅有IdRange,图中为0~16,则代表AXI4信号中的id的位宽为4bit(2^4=16)。
在这里插入图片描述

AXI4 Slave端口的参数

由于要生成的AXI4Xbar有两个Master端口,该两个Master端口所连接的下游模块的Slave端口的参数如下所示。在这里插入图片描述
其中TransferSizes表示数据位宽的字节大小,它可以是一个范围(例如TransferSizes(4, 16)),也可以是一个固定值(此处为固定值64),最终会使用哪个数据位宽则由Diplomacy在模块协商参数的阶段确定。

然后是两个下游模块的地址空间的设置,这将直接影响它们所连接的AXIXbar如何将来自4个上游模块的数据,路由到2个下游的模块。AddressSet的用法是通过设置起始地址和对应的掩码来决定地址空间,例如图中的0xffc00000用二进制表示为:32’b1111_1111_1100_0000_0000_0000_0000_0000,如果我们要使该模块的地址空间为0xffc00000~0xffffffff,这意味着上述起始中的所有为0的bit位都需要变化(如果我们不允许起始地址中的某个bit变化,将对应的mask位设置为0,这样该值会一直保持原状),因此其对应的掩码为0x3ffff。
ddrParams介绍了一种常见的情况,即当我们所需要的地址空间为0x0~0xffbf_ffff时,由于此时无法简洁的用掩码进行表示地址空间,因此使用AddressSet提供的misaligned方法,该方法的两个参数分别为:

  • 起始地址:为0x0
  • 所需要的空间的大小(以数据宽度为1单位):这里为0xffbf_ffc0(二进制为32’b1111_1111_1011_1111_1111_1111_1111_1111),由于我们的数据宽度为64字节(即2^6=64),所以这里需要将最低6bit设置为0,即1100_0000=c0;空间的起始地址和大小会影响生成的端口的地址总线的宽度;

至此我们已经设置好了AXI4Xbar下游的两个AXI4Slave模块所需要的参数。
有人可能会疑问,为什么下游的Slave模块有地址空间、数据宽度等参数,而上游的master没有;这是因为对AXI4来说,无论你上游的AXI4总线的参数是什么,最后的通信效果都是以接收方slave的AXI4总线来生效的。在RocketChip中,上下游的模块会自动协商参数,使得上游Master、中游的AXI4Xbar和下游的Slave的总线参数相匹配。

根据参数编写上下游模块

LazyModule简介

认识LazyModule的最好的方式是认为它分为两个部分:

  • 非硬件实现部分:即在LazyModuleImp之外的所有内容,例如定义Nodes,解析参数等,这被认为是传统意义上的软件代码;
  • 硬件实现部分:即LazyModuleImp内部的所有内容,创建实际的硬件,通常是使用外部解析得到的参数来构建对应的硬件;

因此,应该倾向于将LazyModule和Diplomacy视为创建硬件的两个步骤,第一步是定义硬件拓扑,这是在LazyModuleImp之外完成的,描述每个部分是如何连接的,并解析诸如地址宽度、数据宽度等参数;第二部是实际硬件生成,到这一步时,所有的硬件参数应该已经确定,因此可以根据这些已经确定的硬件参数来生成最终的硬件代码;

上游的Master模块

上游的Master模块如下图所示,其中io_out即为AXI4Bundle,由于本模块没有任何实际的对AXI4总线的操作,因此必须要使用dontTouch来防止编译器将未使用的信号优化掉;
在这里插入图片描述

下游的Slave模块

slave模块有两个,各自的地址空间不相同,需要注意的是,也需要使用dontTouch防止端口被优化。
##在这里插入图片描述

顶层连接模块

创建一个顶层模块,用于连接上、中、下游的模块,如下图所示
在这里插入图片描述

生成Verilog代码

在这里插入图片描述

项目git地址:https://gitee.com/xlgforever/diplomacy_test.git

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值