vhdl - 是否有必要在 VHDL 中编码时将组合逻辑与顺序逻辑分开,同时针对综合?

标签 vhdl register-transfer-level asic soc

我正在从事需要综合我的 RTL 代码专门用于 ASIC 开发的项目。鉴于这种情况,在设计我的 RTL 时将时序逻辑与差分逻辑分开有多重要?如果这很重要,那么我在设计时应该采用什么方法,好像我应该如何区分顺序逻辑和组合逻辑的设计?

最佳答案

我通常会尽可能地分离顺序和组合,直到它导致代码过多(这通常很少见,并且可能表明设计很差),或者当某些事情更有意义时(这也是罕见的,但会发生) .

这种隔离通常有助于初始设计、大脑-> rtl-> 综合(您认为您正在制作的实际上是综合的)、多时钟设计的 CDC 评估、验证和其他事情。我很难举出一个很好的例子来说明一些不好的东西与我称之为好的东西,但这里有一个例子。

假设我有一个要重置为某个值的计数器。我可以做到这一点(我倾向于从具有强大软件和/或 FPGA 背景的人那里看到)

always @(posedge clk or posedge reset) begin
    if(reset) begin
        count <= 0;
    end else begin
        if((count == reset_count_val) || (~enable)) count <= 0;
        else                                        count <= count + 1;
    end
end

或者我会这样做(这是我个人会做的):
//Combinational Path
assign count_in = enable ? ((count == reset_count_val) ? 4'd0 : count_in + 4'd1) : 4'd0;

//Sequential Path
always @(posedge clk or posedge reset) begin
    if(reset) count <= 4'd0;
    else      count <= count_in;
end

以上我同意打字更多,对某些人来说更难阅读。然而,它确实以一种让我更容易看到每个时钟边缘发生了什么的方式分割了电路。我知道“count_in”是在 clk 之前设置的。我可以很容易地看到(以及其他任何查看代码的人),我希望有一个 MUX 用于基于 reset_count_val 的重置或添加计数,最终 MUX 用于基于启用信号门控计数。现在您可以在代码的第一位看到相同的内容,但是 IMO 不太清楚。当您查看 sim 时,您可以看到在 clk 上升沿之前 count_in 的样子。如果 count_in 的条件语句相当复杂,这可以帮助您。

假设您通过综合和布局布线发送了它,并且您在计数 reg 的 Q 和计数 reg 的 D 之间出现时序违规(因为您有基于加法的环回)。通常更容易查看哪个路径导致第二批代码出现问题。这取决于工具(黄金时段更有可能)。 CDC 也可能更容易,因为假设 reset_count_val 来自另一个时钟域中的静态寄存器。该工具可能会尝试综合/细化第一批代码中的 OR,认为 reset_count_val 和 enable 有点相关,这会给您带来看起来很奇怪的 CDC 违规。同样,有时很难想出一个例子来练习所有“为什么你不应该这样做”类型的案例。

作为一个关于拆分组合和顺序的例子,我继承了一个设计,其中有人有一个状态机,它是用同一块中的组合和顺序编写的(总是 @(posedge clk),if/else 会变深并有下一个状态里面的逻辑)。我不是天才,但经过几天盯着那个东西并运行模拟程序后,我无法弄清楚它在做什么。它也很大。我只是重新设计,保持相同的算法,但按照我在此处描述的格式拆分逻辑。即使我添加了一些功能,大小也下降了约 15%。其他有同样问题的工程师在另一个设计中迷失了方向,现在可以理解它发生了什么。情况并非总是如此,但更多时候是这样。

TLDR;
在设计将在 ASIC 中使用的 RTL 时,我尽量做到极具描述性。代码越抽象,就越有可能构建你不想要的东西,或者比需要的更复杂。验证通常要容易得多,尤其是当您进入模拟门时。虽然我属于“代码越少越好”的阵营,但 verilog 并非总是如此,尤其是在 ASIC 上。

关于vhdl - 是否有必要在 VHDL 中编码时将组合逻辑与顺序逻辑分开,同时针对综合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43451692/

相关文章:

c++ - 库的 Systemc 错误

vhdl - 为什么延迟不能在verilog中合成?

programming-languages - VHDL 图灵完整吗?

在没有 FPGA 的情况下测试我的 HDL 代码(Verilog/VHDL)?

arrays - 覆盖 systemverilog 中结构数组参数的大小

hardware - 将两个一维数组相乘的快速方法

concatenation - 在 VHDL 中连接位

process - 何时必须将信号插入进程的敏感列表中

math - 如何摆脱 CORDIC 中的比例因子