建立ASIC设计时学习的经验教训

2021-05-13 11:37:47

自从我开始使用FPGA以来,我一直想做ASIC设计。别的东西,我想从体验中了解它的样子。

去年,我有机会。我现在正在第二个设计中,而是刚刚用的团队刚刚派出了一块这个第二个设计来占用。

然而,这种过程在很多方面都不是不同的。在这里,下面,我不期望的一些差异。

整个设计是存储器控制器,如图1所示。它是一个MemoryController,可以独立出售给客户放置更大的SoC设计。

我需要构建的设计的第一个ASIC组件实际上是公平的。它没有很多逻辑。我个人希望将设计的商品视为美味的序列化器和解序机。它需要8倍的信号样本,并将它们序列化为输出,然后将同性相反。除了,有一些微妙的差异。

更具体地,设计是两个阶段设计过程的前半部分构建内存控制器。第一阶段涉及构建设计的高速度,如图2所示。这是高风险阶段。 ITINVOLVES无法在FPGA中实施的建筑组件。在某些方面,这是设计的Athrow部分,因此最大限度地减少Itscost是很重要的。第二部分将处理与TheDesign相关的协议和逻辑。这是更复杂的部分。它的门数将是很长的。通过在FPGA中验证设计的这一部分,可以优化成本和时间开发。更好的话,如有必要,可以调试和修复协议 - 在ASIC上不容易完成。因此,第一阶段是速度翻译。它与芯片一侧的较慢的逻辑与较慢的逻辑通信,另一个逻辑更快。由于这是用于存储器控制器,因此高速线是双向的,并且每当存在数据时,它们都会伴随时钟。将此时钟转换为90度的挑战,因为延迟时钟才能在接收数据位的Themiddle中进行采样,但设计仍然非常基本。

并非所有这都是我的错。正如我所了解的事情,工程师在我面前在我面前担任这个项目已经离开了中间项目。我的工作就是在他离开的地方挑选。不幸的是,这意味着当签署我的合同时最后一个工程师和当我的合同签名时,有一些管理层。如果我开始时,我甚至不确定我甚至在我开始时拥有这个项目的带宽,所以我通过每周延迟了该项目的竞标。

该项目也迟到,因为在建立我的部分(在2-4周内)后,我发现这几乎没有足够的。当然,IFORMALLY验证(几乎)设计的各个部分,但我无法将整个设计结束结束。低速逻辑设计仿真在非功能状态下向我传递给我,我刚刚改变了接口的顶部。总的来说,这是一个非起动器。如果我无法验证整体,我是如何知道如果我的新界面足够了,那么

所以,让我们备份一点以了解这是如何开始的。我被赋予了协议部分和物理层部分的设计,相同的几个模拟组件 - 就像图3一样。

我被告知了很多事情。例如,这是从以前的工作设计留下的东西,这些设计已被提供给客户。从那时起,该设计已经被先前的工程师调整和修改,但是尚未将其交付交付。我也被告知,考试脚本的一半是通过的。此外,8B内部接口对于FPGA来处理太快,因此我需要通过平行数据路径来减慢它。因此,我的初始任务只是简单地升级数字前端的8位数据路径到64位数据路径。这项任务非常简单,这是谷歌这个ASIC设计的部分。

直截了当?是的。但是,它确实让我抓住了所有的原始设计,我必须在更多的地方进行更改,而不是我期待 - 甚至是注定被报废被报废的低速逻辑作为我升级的一部分。

例如,给我的设计的AXI总线宽度自然32位。这与Axi4-Lite控制器很好地工作。然而,64位数据路径意味着总线还需要进行64位宽,或者总线宽度将成为性能瓶颈。

下一个问题是我给出的模拟不起作用。是的,这一激励支持几百个单独的测试,但我被告知了大多数人都没有工作。

最重要的是,我在桌面上访问的免费Verilog模拟器Icarus Verilog在调用任务时不支持SystemVerogdot表示法。因此,在Icarus Verilog中达到模拟,花了一些时间。

让事情变得更糟,一旦我到达了我可以尝试一个或两个“验证的”测试的地步,那就是我可以测试第一个模拟应该“只是工作” - 他们没有工作。相反,“验证的”测试是最糟糕的事情:他们挂了模拟。如果,如果,如果我应该杀死模拟,或者如果它实际上是有用的,而且在没有打印到屏幕上的东西时,那就留下了墨守作用。

毋庸置疑,我的2-4周任务比我迷茫地面完成了更长时间。现在是五个月后,设计只有陷阱。

说真的,我会成为一个更好的工程师,当然可以估计比我今天更好地完成项目的时间来完成项目的时间。

直到我建立了我的设计之前,我有机会阅读客户和他的客户之间的理论合同。该合同已称为内置自检(BIST)功能。哎呀。我没有建立那个。没有问题,我想,我可以用简单的BIST能力添加Justa耦合额外的寄存器。

首先,有控制线。从属访问端口需要抛绑定,以便它们可以打开BIST检查器。那部分很容易,我知道如何正式验证总线寄存器可以正确控制,所以我很好。第二部分是捕获动态信号的内部状态。这几乎是简单的,

但它在模拟中工作了吗?不,我没有为它建立模拟。

建立模拟拍摄了另一天,因为我需要检查可以在上面捕获的所有名字比特。 (捕获信号越宽于单位。)它然后拍摄另一天(或两个)以使其全部工作。

任务完成了吗?不,现在,每次我更改设计时,我都必须退回,重新验证此模拟。更糟糕的是,由于在这种设计中的时钟GameStaking的地方,这个逻辑产生了各种定时错误。最后,我将捕获信号分成两个,每个Captured都是单独的时钟。即使是那还不够,因为我稍后只深受关注他们的八个内部值在其自己的小钟上被捕获 - 但这是较长故事的一部分。

对于另一半,我建议通过输入通道监控高速行程的输出。数据只能在设计的高速部分内反射到输入上,如图5所示。5下面。

我估计,这可以通过在前一端的简单无逻辑变化实现。也就是说,直到我实际拍摄Timeto模拟它,而不是告诉大家,这是一个禁用的变化,而不是告诉所有它会“只是在工作”。只有在此检查的仿真中才会实现了我意识到我已经转过了反射来优化电力。虽然我修复了设计来实现这一点,但我没有期待的第二个问题。因为设计在传输时,设计将接收并返回其自己的传输数据,因此无法在发送和接收之间共享I / O线。这近来,ASIC上的I / O引脚数差点为AI / O引脚垫的大小主导ASIC的大小,因此是它的制造单元。

这两种调整只需要对我们的高速ASIC设计进行最小的设计调整。设计变更可能仅采用15分钟。构建证明这些变化所需的模拟可能会对每个人留下近一天。在磁带处运行所有各种模拟仍然需要几天 - 假设一切都有效。

即使是这些早期的模拟也不是验证任务的结束。 oncethe设计被布局并从设计中所知的内部时序值,然后需要再次验证,然后再次作为设计的第二代,并且再次作为第三部分等。我的第三部分“工作”逻辑必须经过模拟器,这对我感到震惊。更多的是到来。

我收到的设计的第一件事之一是剥离所有未使用的逻辑。这意味着我没有使用的逻辑以及我无法解释的任何逻辑。因此,我很快删除了test_modeinput,以及与它相关联的几个扫描_ *输入,例如scan_clk。

在我将设计发送到布局工程师之前,这很棒。他告诉Mei必须将这些值放回设计中以支持DFT扫描链插入。

我们的DFT实现了基本扫描链的工作。这意味着在通过整个设计中运行的全部换档寄存器所需的每个触发器。这允许您在制造后测试基因的内部电路,以验证它是制造的是否制造。

这意味着我不得不回去并将这个逻辑放回删除它的设计时。

这觉得有点奇怪。 dftsignals没有连接到RTL中的任何内容,它们生成了VerilatorLint错误,但它们显然仍然是必要的。

这是最大的变化。我需要在我的设计中添加一个时钟切换到每一个时钟。如果test_mode很高,则DesignErquired使用Scan_Clk。如果test_mode低,则将使用DesignClock。

不像博客上之前研究的ClockSwitchWe,此开关只不过是更简单的多路复用器,从而选择两个时钟将在TheOutput中产生。

每个内部时钟都需要与SCAN_CLK复用。此外,除了上面提到的来潮之外。

基本上,如果要创建逻辑生成的时钟,则随后将成为触发器的边缘,然后DFT LogicEEEDS能够将该下游逻辑与Scan_Clk.every时钟块切换到设计中,因此而不是只是那些来自PLL的那些,在使用之前需要一个多路复用器。

这也意味着在DFTTEST模式下,只会在整个内计中都有一个时钟。这将自然地限制DFTTEST模式实际测试的东西。换句话说,任何可能在硅中需要完成的进一步测试和验证是我的责任。

这个也让我感到惊讶。因为我的设计逻辑可能会切换onan异步重置,所以它还需要多路复用器到Bypassthe复位同步器当测试模式处于活动状态时。

在许多方面,这种DftLogic看起来并表现得非常像JTAG逻辑可能 - 但没有JTAG状态机。它们是一个长移位寄存器,甚至是Shift Registers-i.e。 Thescan链,在设计的设计内,由此Dftcircuitry控制。我只是没有意识到我作为数字设计师先前的Tolayout,在这个过程中发挥作用。

换句话说,下次我给出了这样的设计,我不会像我的第一步一样地扯掉DFTLOGIC。

ASIC生产的制造成本通常与设计的区域成比例。更具体地说,成本由低于制造晶片所需的面罩来支配成本。在给定晶片上也可能是多个不同的碎片,以帮助在多个用户跨越制造晶圆的结果。仍然留下了瓦斯拉亚作为优势的成本衡量标准。

在此设计之前,我一直认为这意味着设计的逻辑区域,如在栅极计数中测量的,然后将大致比例而不是整体区域,因此将占据整体制造成本。

令我惊讶的是,我发现每个I / O垫连接到世界外面的设计需要最少的区域。在我的情况下,DesignErquired这么多的I / O垫认为这些垫的大小证明是占据设计的主导。实际的栅极区域要小得多。

即使除了I / O垫尺寸外,也有一个非常大的模拟剖面Tothis高速芯片。除了处理不需要的静电Discharge(ESD)或“清洁”所需的电路所需的电路之外,这包括PLL和几个DLL的内容包括模拟逻辑所需的电源。我从未想过以前的这些组件的设计,并令我惊讶的是与他们相比,数字逻辑似乎小的数字逻辑。

好的,我会在这里诚实,我从未在任何DesignsProir中使用过'x传播到这些ASIC项目。我最喜欢的模拟器Verilator,不支持它们作为设计决策。 Symbiyosys,我使用的完整验证工具,始终将“1或'0分配给每个值ina损坏的跟踪,并检查所有可能的值,以便为初始值 - 所以我没有需要'x支持。

然后,客户抱怨说,我的第一个ASIC设计并没有在他们的应用中工作。我将投诉追溯到两个问题之一。

我很喜欢使用任何组合逻辑的@(*)块。单独的,我在处理下面的那样使用此块时使用此块

reg [n - 1:0] val;生成if(opt_design_option)开始总是@(posedge clk)开始//一些复杂的块设置val结束否则early @(*)val =常数;结束终止

我喜欢这种方法,因为我不需要创建第二根线以保持val中的值。

这种方法的问题是没有任何攻击始终@(*)块。它不是硬件中的问题,val被赋予常量作为其定义。它只是模拟中的一个问题。在仿真中,VAL没有给出初始值,并且永远不会触发始终@(*)块,因为它内部没有变化。结果,Val在模拟中保持x(未定义)。

SystemVerilog规范在always_comb的定义中有点修复了这个问题。但是,除了LocalParams之外,我试图避免SystemVerilog功能,以便我可以与那里的旧解析器保持兼容性。

修复此迫使我调整我的个人设计标准,使VAL将被定义为这些构造中的电线(A.K.A. A网)。这也意味着我现在需要定义一个单独的寄存器,让我们称之为r_val,前逻辑集。最后,将导线分配任一向得到的值。

电线[n - 1:0] val;生成if(opt_design_option)begin reg [n - 1:0] r_val;总是@(提出clk)开始//一些复杂的块设置r_val结束指定val = r_val; exhelse begin指定val =常量;结束终止

就个人而言,我发现这很麻烦。但是,它现在将成为我个人编码标准的一部分,以免再次遇到这个错误。实际上,现在这个新的编码指南之后的zipcpu也有一个版本。

在此示例中,div_clk未给出初始值,因为嗯,ASIC中不允许初始值。只要硬件可以在0或1处修复值,这个时钟分频器就会做正确的事情。更好,我可以使用正式的工具来验证这个简单的电路是否会做正确的方式。问题不是硬件不起作用,问题是模拟器无法使用这样的内容。 div_clk将被赋予“x”的初始分配,以及任何取决于它的任何东西都会得到'x值。

所有这一切的结果是我发现自己强迫信号被重置,根本不需要重置。

到目前为止,我已经非常重大在我的设计中使用了初始陈述。他们在FPGA设计中工作得很好。他们只是在AsicDesigns中的所有工作。

更糟糕的是,由于'x传播问题,任何由theasynchronous reset设置的位都被标记为'x并显示镜头拇指Onany模拟跟踪。

根据一些Xilinx文档,我还避免了过去的异步重置,这表明RF干扰可能会引发意外异步重置。 (我已经被XilinxDesigner询问找到该文件,...我不记得我在哪里发现它。他们声称异步重置应该很好。)

没有那么设计。在这种情况下,每个牌照都以互换复位初始化。在某些情况下,在钟表之前,异步重置将是Activelong。

这也影响了我的正式证据。我的第一次尝试缺少缺乏的缺陷陈述,该声明涉及的缺陷陈述的任何断言在证明的第一个时钟周期中。现在,我开始进入所有正式断言的栖息地,重置检查,以确保在重置完成后,逻辑工作。

这也意味着我的AXI总线Propersets现在的异步重置检查选项。如果打开此选项,则AXI属性集现在将在CLEAK之外,在CHERS CLACK上,AXI属性集现在将所有有效的标志转到零。

也许我不应该抱怨。正如我上面提到的那样,逻辑很便宜。一旦我知道发生了什么,这些修复只需花几分钟的时间。这不是那么多的成本,这是验证部分更难的。

在FPGA中,有规则码头。一项规则是逻辑生成的时钟很糟糕。通常,FPGA工具库不处理任何逻辑生成的时钟的定时分析,逻辑生成的时钟没有与其来自的Theclock具有相同的时序关系,并且它不会在时钟路由网络上自动放置。这些都是逻辑生成时钟通常坏的原因。

AsiC设计是不同的。实际上,一旦你挖掘ASIC的杂草,你可能会开始相信所有时钟都是逻辑生成的。你会在某种程度上做出,因为即使plls也有一定数量的逻辑。

与FPGA不同,ASIC不带一套专用时钟路由网络。相反,ASIC设计中使用的时钟树必须出现并插入设计中的每个时钟的设计。

我在明尼苏达州长大,不远离锁和大坝第一个在Themississpipi河上。锁定和陷阱以来成为我的图像,以了解电路内的功率使用。想象一下,如果您愿意,电动设计中的每根电线都是河上的锁,可以保持水(即充电)。每次填充锁时都使用能量,并且它被填充锁定所需的水量释放。

水位越高,即核心电压在设计内的越高,填充锁的填充越多。同样,锁定的水位(A.K.A电压)需要调整较长的水位,调整它的水越多。

时钟树相当于整个设计中的长锁室,所有这些都需要填充。从一个电压LE切换树需要大量的电流

......