凿子(Chisel):如何实现一个高效的一位有效多路复用器?

11
我有一张表格,其中每一行都包含状态(寄存器)。有一种逻辑选择了一行。只有一行会收到“选中”信号。然后访问来自所选行的状态。可以将状态的一部分作为输出连接到模块的IO,或者使用IO的一部分作为输入来更新状态。
如果用电路实现这个功能,我会使用传输门。选定的信号会打开一个传输门集,将该行的寄存器连接到总线上。然后将总线连接到IO捆绑。这样做快速、占用空间小、能耗低。
在Chisel中有一个简单的方法来实现这一点。它将所选行编码成二进制数,然后将该数字应用于传统复用器的选择输入。但是,对于具有20到50行和状态数百位的表格,这种实现可能会很慢,并且浪费面积和能量。
问题有两个部分: 1)是否有一种在Chisel中指定总线的方法,使得传输门或传统的三态驱动器都悬挂在总线上?
2)如果没有,是否有一种快速、占用空间小、能耗低的方法在Chisel中实现这一点?
谢谢
1个回答

5

1) Chisel并不完全支持双向传输线,但是通过实验性的模拟类型(请参见示例),您至少可以在Verilog黑盒之间穿过一个总线。

2) 您尝试过chisel3.util中的Mux1H吗?它基本上发出输入和相应选择位的积和。我不确定这与您提出的实现相比如何。我很想看到一个QOR比较。如果此结构不足以表达您想要的精确内容,并且您无法在Chisel中准确表达它,则可以使用参数化BlackBox来实现您的单热多路复用器,并根据需要进行实例化。


谢谢提供链接。这实际上为我们带来了一个持久而关键的问题。我们不是精通编码的人。但是实施Rocket和Chisel开发人员是。软件编码实践的复杂程度远高于我们的技能水平。理解Mux1H的实现所需的学习是非微不足道的。 - seanhalle
这种 Chisel 代码的难以理解一直是一个持续的障碍。一方面,基本的 Chisel 比 Verilog 更高效。需要大约一个月到两个月的时间才能够在 Chisel 中交付可用的工作成果。我们雇佣的人中有大约60%因为无法达到这个水平而离职。但是像 Mux1H 和越来越多的 Rocket 代码所代表的水平,我估计需要大约6个月到1年的时间才能熟悉那种编码实践。对于我们来说,当我们要制作商业产品并雇佣普通的 Verilog 开发人员时,这是一个真正的问题。 - seanhalle
进入答案的内容...感谢有关Analog的提示。在第1点中,我没有清楚地提到Verilog Black Boxes。而且我对双向也不清楚。总线实际上是单向的。它只有多个源可以驱动同一根导线。例如,三态驱动器是单向的。此外,将值放入总线并从总线接收的逻辑都是Chisel。没有涉及Verilog Black Boxes。 - seanhalle
在第2点中,我怀疑Mux1H就是我提到的实现1 hot的直接方式——一棵mux树。这种方法相当庞大且耗能。问题的要点在于找到具有更少门和更低功耗的替代方案。标准总线将是这样的电路之一。是否有办法让Chisel打印出它生成的节点的图片?例如,FIRRTL节点以及它们如何连接到彼此的可视化?如果我们可以看到代码生成了什么,这实际上会有助于解决代码的不透明性问题。 - seanhalle
更新--已经查看了提到的模拟凿子,再次感谢指引。原来模拟器件是关于连接具有模拟端口的模拟块盒子的..明白了,谢谢。虽然不清楚它如何应用..问题是如何在Chisel中高效实现one-hot。使用黑盒意味着要用不同的语言实现..问题是关于Chisel特性的,允许在Chisel语言内进行高效实现。 - seanhalle
看起来Chisel不支持三态驱动器或总线。它只允许这些在其他语言中实现,比如Verilog,然后通过BlackBox进行接口。主要问题是模拟和验证...我们仍在使用Chisel 2,因为我们正在与LowRISC一起工作,而它还没有更新。 (请参见上面的评论,了解原因...2016年7月的代码库比2017年3月的代码库更易于访问)。 Chisel 2的模拟器不包括黑盒的行为... - seanhalle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接