世界由于人这个最大的无厘头变量,还是比技术本身复杂难懂很多。各种技术的兴起与发展总是有其背后的理由的。这篇文章是这个系列的第三篇文章,主要来说明Chisel比Verilog在某些方面具有优势的理由。
换句话说。为什么要用Chisel? 它相比于Verilog好在哪儿?
在我看来,Chisel相对于Verilog来讲,最大的优势特性有两个:
- Chisel的代码复用
- Chisel的设计参数化
分两次讲。这次主要讲第一个原因:Chisel的代码复用。对于数字电路来讲,设计模块主要就是设计两个东西:端口与逻辑。
这篇文章的思路也是从这两个方面展开。如何在高效利用端口的复用提升效率与如何高效的复用逻辑提升效率。
一、端口的复用在端口方面,verilog模块在端口的定义与连接上异常繁琐且易出错。此处介绍在chisel中如何快速的处理该问题。chisel主要通过端口的嵌套、端口的继承、端口的重载三个方面实现高效的端口代码复用。
1.1 端口嵌套:实现模块化端口连接
Chisel可以通过模块化的端口大幅减少端口的定义与连接工作量。比如下列案例,Module A与Module B与Module C。
此处可以定义以下端口。
模块A的端口可以利用PORT B与PORT C组合生成,只需要使用Flipped()函数反向,组合起来即可。
则三个module连接直接使用连接会节省大量工作量。
当PORT B与PORT C足够复杂时,该方法能够节省大量工作量。
总结:模块化的端口、灵活用Flipped() 、端口连接联合使用可大幅提升端口连接效率。
1.2 端口继承:快速扩展端口
例如,给PORT_CC加一个输入端口c2.
实现的verilog如下:
总结:直接使用extends继承端口可以快速扩展出新的端口。
1.3 端口重载:方便对端口数据进行改写
如图,再添加一个端口PORT_CD, 把c1的位宽改造为8位。
生成的verilog如下:
可以看到c1已经变为了8bit.
二、逻辑的复用2.1 逻辑的继承:子模块直接继承母模块的逻辑
如下代码,Module C实现一个加法,Helloworld继承了ModuleC。虽然在Helloworld没有实现加法行,但最后的逻辑中包含了加法。
总结:模块内实现的逻辑是会被继承下来的。一方面可以复用代码。另一方面可能造成不希望被继承的逻辑被继承。
2.2 逻辑的重载:可以修改部分逻辑
例如在Helloworld模块中重写c2输出逻辑,在子模块的逻辑将会覆盖母模块。
实际上生产的verilog代码如下,变成了减法器。加法不再存在。
2.3 函数的继承:显式的继承功能而不是继承逻辑
如下图所示,如果需要显式的继承逻辑功能,需要在Module C中定义一个函数而不是直接把加法实现在Module_C中。
此时在HelloWorld中直接调用def的add函数即可实现需要的加法功能。
2.4 函数的重载:重行改写函数
如下图所示,直接在helloworld里将add重载为减法(手动狗头)
最终生成的verilog如下:
Chisel在实现模块内部逻辑时和verilog实现并无太大差异。但Chisel相比于verilog在可复用与参数化方面具有较大优势。本文主要介绍chisel在可复用方面的性质。
总结起来,端口可以利用嵌套、继承、重载实现最大限度的复用。逻辑也使用函数形式或者纯逻辑的继承与重载实现代码复用。
个人认为逻辑复用似乎在实际工作中用途有限,但端口的复用机制可大幅减少端口声明与模块连接工作量。
终于写的差不多了。下一讲写另一个方面的优势:参数化。