电子产业一站式赋能平台

PCB联盟网

搜索
查看: 37|回复: 0
收起左侧

【芯片设计】从RTL到GDS(三):逻辑综合

[复制链接]
匿名  发表于 2024-8-21 11:56:00 |阅读模式
本篇文章给大家讲解逻辑综合相关的内容。本篇文章信息量很大,后面还会有一篇文章讲逻辑综合剩下的内容。让我们开始吧。

课程大纲如下所示:

1、Introduction对于芯片工程师而言,肯定都接触过逻辑综合。但是很多人只知道要做逻辑综合,并不是很清楚逻辑综合这一过程到底经历了什么。很多人也只是用现成的脚本,跑综合看有没有违例,如果有的话就可以改代码。
这样做不是说不行,但我认为知其然也要知其所以然。理解逻辑综合的本质,有助于我们写出更好的RTL代码。并且可以让我们写出更好的综合约束脚本,对于提高整体的设计能力,加深对电路的理解都是非常有帮助的。所以我们一起来学习一下这既熟悉又陌生的逻辑综合吧。

什么是逻辑综合?我们都知道数字芯片设计,首先需要写Verilog之类的硬件描述语言,但很显然。这些硬件描述语言和电路之间仍然存在一个很大的GAP。肯定需要有一个工具,来帮助我们将硬件描述语言转换为实际的电路。这个电路的层次可以不那么高,那就先转换为与或非门的各种组合吧。
逻辑综合便是这个工具人,其基于我们的约束条件,将我们写好的RTL代码转换为门级电路。
为什么我这里要强调约束条件呢?从RTL转换为门级电路,这个我相信大家都能够理解。但在不同的约束条件下,转换的门级电路有可能是很不一样的。我们都知道一模一样的逻辑功能,可以用不同的方式实现,其如果要跑很高的频率,可能需要尽可能的规划好每个门电路。如果跑的频率很慢,可能随便弄弄就行了。
这里我举个不太恰当的例子,不同人写的代码完全不一样,我们可以对应成中文,德文等等。逻辑综合相当于把其翻译成英文。翻译成英文也要看具体的场景,如果是朋友聊天,那就用简单的语句,能听懂就行,粗俗一点也没什么大不了。如果是正式的公务文件,那就需要仔细斟酌如何翻译的更好更准确,这里面的场景就可以类比于约束条件。(简单举个例子,不要太较真!)
做逻辑综合之前你需要准备什么?首先你需要准备好RTL设计,这个大家都能理解。然后你需要约束条件,这个开始也提到了。此外你还需要标准的单元库,比如你是要用什么工艺,多少nm?什么厂商?其提供的Cell都不太一样,既然Cell不太一样,组合肯定有不同的区别。
这里我也举个简单的例子,比如你要将一段自然语言描述的算法,比如给一组数进行排序。转换为可以执行的代码。这里你的自然语言描述:”给一组数进行排序“就是你的RTL代码。排序的速度要有多快,这就是你的约束。转换为Java还是Python还是C还是什么语言,这里的语言你就可以理解为不同的标准库。相信基于这个例子你能理解这三个概念了。
完成综合以后你会得到什么呢?
你会得到一堆门级网表,其映射到具体的标准单元库,也就是这些门级网表不是局限于与或非门简单的概念,而是有真正的延迟信息等的实际门电路。
对于FPGA而言,也有综合,但很多人可能忽视掉了,FPGA的综合和布局布线可以一键生成,其调用的是FPGA的各种资源,比如LUT,flipflop,FPGA上的BRAM等。
理想情况下,最终得到的综合结果需要同时满足速度、面积、功耗等的约束条件。如果没有满足呢?后面告诉你答案。

我们来看一个简单的例子,给你一个状态机模型。其用HDL描述,类似于一段数学语言。逻辑综合会将其转换为具体的电路,这个电路是各种电路组件以及连线的集合。
这其实是从数学角度去描述,本质上逻辑综合工具也是这么做的。在你看不见的背后,其将所有的一切都转换为了数学能描述的东西,各种各样的数字,运算符,表达式。在满足约束的条件下进行优化。其本质上就是个约束优化问题。
当然,这是做EDA工具的人需要考虑的东西,对于芯片设计工程师而言,还是要从电路的视角去分析。

我们再来看一下为什么要做逻辑综合:
逻辑综合可以自动管理设计过程中的许多细节:
减少错误:通过自动化处理许多设计细节,当发现你设计有误的时候,综合工具会有Error和Warning。
提高生产力:设计师可以专注于设计的高层次结构,而不必担心低层次的实现细节。
提高生产力:设计师可以专注于设计的高层次结构,而不必担心低层次的实现细节。
抽象设计数据:逻辑综合将HDL描述的设计数据从任何特定的实现技术中抽象出来,使得设计可以在不同的技术之间迁移。这其实指的是,对于设计人员而言,不用过多的考虑工艺本身的问题,专注于RTL即可(当然也要考虑时序等)。
当然逻辑综合不是全面的,很多时候其无法将我们的设计转换为最佳的电路形式。这就好比你写了个很慢的排序算法,编译器不能将你这个算法转换为快速排序的机器码一样。大家不能过度依赖于编译器优化,尽可能自己在RTL这一步就将design做好。

我们看一个简单的例子,你写了这样的一段RTL,逻辑综合可以进行一定的优化,比如与门就优化没了。但实际上这还不是最优的,为什么?自己思考一下。

我们来看一下综合的目标。我们希望面积尽可能的小,因为面积越小,一个Wafer上的芯片就越多。成本就越低。我们还希望功耗尽可能的小,这个就不用我说原因了吧。我们还希望性能尽可能地好。当然也可以是上述的组合,比如在满足时钟频率大于300MHz的情况下尽可能让面积小。
这一切的一切,实际上都是一个数字优化问题,了解芯片设计的朋友都知道。芯片的PPA从逻辑上来说就不可能全部达到最优,其必然涉及到一个折中。这本质上也是个数学求解问题。逻辑综合会使用一系列的启发式算法,尽可能达到我们的要求。
当然你也不能过于为难综合工具。比如你一段组合逻辑极其冗长,你还要整体跑到2GHz,此时综合工具会进入摆烂状态,永远无法收敛。

了解完目标以后,我们看一下综合工具是如何工作的。
Instantiation(实例化):实例化是指综合工具维护一个基本模块(如AND、OR等逻辑门)和用户定义模块的库。在设计过程中,这些模块被实例化(即创建实例)并连接起来以构建更复杂的电路。
Macro expansion/substitution(宏展开/替换):宏展开或替换是指综合工具将HDL中的高级语言操作符(如增量运算符++、减量运算符–、布尔运算符等)和构造(如if-else、case语句)展开成特定的电路。例如,一个if-else语句可能会被展开成一个多路选择器(multiplexer)。
Inference(推理):推理是指综合工具在语言描述中检测特殊模式并特别处理。例如,综合工具可能会从变量声明和读写语句中推断出内存块,或者从always @(posedge clk)块中检测和生成有限状态机(FSM)。(所以状态机之类的代码请按照模板写,你写的很多if/else可能也会生成状态机,但那样并不直观。写代码的时候对生成的电路应该有预期)
Logic optimization(逻辑优化):逻辑优化是指综合工具对布尔运算进行分组,并使用逻辑最小化技术(如卡诺图、Quine-McCluskey方法等)进行优化,以减少逻辑门的数量和层次,从而提高电路的性能和效率。(到这一部分你写的代码和实际生成的电路可能就会有一定区别了,但实现的功能还是一样了,只不过逻辑更简化了)
Structural reorganization(结构重组):结构重组是指综合工具使用高级技术,包括操作符共享和电路重定时(即retiming,主要是移动触发器FFs)等,来优化电路结构。这些技术可以帮助进一步减少资源使用和提高电路性能。如果你的代码写的不好,那么到这一步生成的电路可能你就不太认识了。综合工具会帮你做很多事,但这些事没那么可控,所以还是那句话,请写好RTL代码。

我们再来看一下综合的Flow,以下对应的实际上是Cadence的GENUS工具,该工具用的很少,大部分公司还是使用Synopsys的Design Compiler。但这里我们仍然基于课件讲,因为命令虽然不同,但流程基本上是一致的。不影响大家学习原理本身。
首先首先需要先把设计给读进来进行语法分析:
这其实就是图形化的导入过程。语法分析是编译过程中的一个步骤,它检查HDL代码的语法是否正确。在这个阶段,编译器会解析代码的语法结构,确保代码符合语言的规则。如果代码有语法错误,编译器会报告错误信息,设计者需要修复这些错误。(我的建议是,先跑LINT,LINT清理干净了再跑综合)
然后是库定义:
库定义是指设计者定义和链接到综合工具的库文件。这些库文件包含了标准单元(Standard Cells)、宏单元(Macro Cells)、时序库(Timing Models)等,它们是综合工具生成门级网表的基础。设计者需要确保库文件是最新且与综合工具兼容。这个库一般是foundry提供的,还有一些是IP公司提供的。
Elaboration and Binding(展开和绑定):
展开是指综合工具将HDL代码中的高级构造(如if-else、case等)转换为低级电路。这个过程中,综合工具使用库定义中的信息来替换这些高级构造。
绑定是指综合工具将HDL代码中的信号与库定义中的单元进行连接。这个步骤确保了设计中的信号能够正确地连接到综合后的硬件资源上。
约束定义:
约束定义是指设计者定义的一组时序和面积约束条件,这些约束条件用于指导综合工具生成门级网表。这些约束条件可以包括时钟周期、时序路径、最大功耗等。综合工具会尽量满足这些约束条件,生成一个满足设计要求的硬件实现。其一般采用sdc格式,对于FPGA而言是xdc格式,其都是tcl的超集,后面详细讲。


完成上述的步骤,就要开始优化了。
Pre-mapping Optimization:
将RTL代码中的逻辑表达式映射到通用的逻辑单元,即GTECH格式。映射到通用单元的优点是可以提供更灵活的设计优化,因为设计者可以在技术映射阶段之前对逻辑结构进行调整,而不受具体硬件实现的限制。
这一过程还会使用一些启发式算法进行逻辑优化,比如遗传算法,模拟退火算法等等。
Technology Mapping:
将之前通用的GTECH格式映射到实际的库上。这些库是带各种实际信息的,比如延时等等。
Post-mapping Optimization:
在技术映射完成后,综合工具会对设计进行进一步的优化,以提高性能和面积效率。这可能包括:
时序优化:调整逻辑门和触发器的时序参数,以确保设计满足时序要求。
面积优化:移除不必要的逻辑门和布线,以减少面积和功耗。
当然这个可以很复杂,不详细展开了。
Report and export(报告和导出)
在综合完成后,综合工具会生成一份详细的报告,包括综合结果、时序分析、面积估计等。
设计者可以使用这些报告来评估综合结果,并根据需要进行调整。
综合工具还会将最终的门级网表导出到后续的布局和布线(layout and Routing)工具,以便进一步优化和生成实际的物理版图。


2、Compilation通过第一节,我们已经了解了综合的整个流程。其实再综合之前我们应该对RTL进行编译,这一部分其实是用别的工具帮忙检查语法错误等。因为我们不能依赖综合工具去做语法检查,其重点应该是综合,其对语法的检查没有那么完备。

以下是检查语法错误的方式。我的建议是使用LINT,一般是用Spyglass工具检查语法错误。

3、Library Definition接下来我们看一下Libraray定义(其实际上讨论的都是各种各样的Standard Cells)。综合和RTL仿真不一样。其要映射到实际的GDS,这一过程跟使用什么器件库直接相关。(下面的命令不用太关心,DC的命令和这个有区别,关键是搞懂这一步本质是干什么)
在逻辑综合流程中,Library Definition(库定义)阶段是设计者告诉综合工具在哪里查找叶子单元(leaf cells)以进行绑定,以及目标库用于技术映射的阶段。以下是这个阶段的详细解释:
1、Leaf cells for binding:
在综合过程中,叶子单元是指那些没有子节点的单元,它们通常是综合过程中最基础的单元。这些单元通常是库中的标准单元,如与门、或门、非门等。
绑定(Binding)是指综合工具将HDL代码中的信号连接到库中的具体单元。在库定义阶段,设计者告诉综合工具库中哪些单元可以用于绑定。这通常涉及到定义库中单元的端口映射和时序模型。(对展开和绑定先简单这么理解,后面会详细讲,到时候再回过头看看整篇文章)
2.Target library for technology mapping:
技术映射(Technology Mapping)是将RTL代码映射到实际的硬件单元的过程。在这个过程中,综合工具需要知道目标库中的哪些单元可以用于映射。
目标库是一个包含特定工艺节点(如90nm、130nm、180nm等)的标准单元和宏单元的集合。这些单元已经过优化,以适应特定工艺的特性,如功耗、时序、面积等。
在库定义阶段,设计者会告诉综合工具目标库的路径,这样综合工具就可以在技术映射阶段使用这些库中的单元。
Tips:综合的时候对综合器报的Warning请好好注意。

到底什么是Library?这里用一个简单的例子类比。准单元库类似于乐高积木,它们必须满足预定义的规格要求,以便综合(Synthesis)、布局(Place)、布线(Route)等EDA工具能够无误地操作它们。
大家直接理解Libray就是蕴含了一套特定的信息的库(或文件)即可,各种各样的EDA工具可以基于这套信息,做出不同的规划决策。

我们来看一个实际的例子:一个与非门,其包含了Cell的高度,宽度,电压轨,阱等等信息。这些信息都在Foundry提供的文档可以找到。
理想情况下,标准单元应该完全在M1层上布线。这是因为M1层是构建逻辑门和互连的主要层,直接影响到电路的性能和功耗。完全在M1层上布线可以减少布线延迟,提高电路的时序性能。此外,这还可以减少布线所需的层数,从而降低成本和功耗。然而,实际上,由于标准单元的大小和布局的限制,可能需要在M1层之外的其他层上进行布线。此外,M1层可能已经很拥挤,因此可能需要使用M2、M3等其他金属层来完成布线。

标准单元库里面主要有哪些单元呢?我们可以大致分为以下四类:
组合逻辑单元:
比如各种各样的与非门、反相器等等;
有很多驱动强度可以选择;
有很复杂的单元,比如与或非单元;
CMOS工艺扇入能力比较差,一般这种标准单元的输入
ECO单元,易于更改的单元,用于在设计过程中进行快速的修改;
Buffers/Inverters:
提供更高的驱动强度,用于增强信号强度;
具有平衡上升和下降时间的时钟缓冲器,用于时钟信号;
Delay Cells:提供固定的延迟时间的单元,用于时序调整;
Level Shifters: 用于将信号从一个电压电平转换到另一个电压电平的单元;
时序单元:
Flip Flops: 各种类型的触发器,包括上升沿触发、下降沿触发、置位/复位触发、Q/QB触发器、使能触发器;
Latches: 一种简单的存储单元,可以存储一个比特的数据;
Integrated Clock Gating cells: 集成时钟门控单元,用于在时钟信号到达时才激活存储单元;
Scan enabled cells for ATPG: 支持扫描测试的单元,用于自动测试模式生成(ATPG);
物理单元:
Fillers: 用于填充空隙的单元,以优化布局;
Tap cells: 用于布线的连接点;
Antennas: 用于增强信号强度的单元;
DeCaps: 去电容单元,用于减少电容效应;
EndCaps: 用于芯片边缘的单元;
Tie Cells: 用于连接到特定电平(如电源或地)的单元;
我们接着往下看。同样是NMOS,不同的尺寸有着不同的驱动强度。这些东西其实在数字集成电路上面都有详细讲。我这里也不展开了,大家看看课件就行。总而言之大和小没有绝对的优劣。大的驱动能力强,但相应的面积、泄露功耗等就会增大。
Multiple Threshold (MT) CMOS是一种用于数字集成电路设计的工艺技术,它允许通过添加一个额外的光刻步骤来在晶体管通道中施加更多或更少的掺杂,从而改变阈值电压(VT)。
这种技术使得设计者可以在速度和泄漏电流之间进行权衡。比如SVT单元通常具有较低的阈值电压,因此可以提供更高的开关速度,但可能会导致更高的泄漏电流。HVT单元具有中等阈值电压,提供平衡的速度和泄漏电流性能。LVT单元具有较高的阈值电压,可以提供较低的泄漏电流,但可能会牺牲一些开关速度。

我们再来看一个重要的标准单元,时钟单元。对于标准时钟单元而言,其从高到低和从低到高的时间不是一样的。这对于始终网络并不友好。可能会引入预期之外的clock skew。可以有定制的clock cells,其rising和falling的延迟很均衡,从而减少clock skew。这些单元通常在数据传输路径上不如标准单元高效。因此,设计者应该避免在这些单元上使用数据传输路径。
集成时钟门控(Integrated Clock Gating)是一种特殊单元,它不仅提供了平衡的时钟延迟,而且还包含了用于时钟网络的逻辑门控。这些单元可以用于时钟网络上的门控逻辑,以减少时钟网络的功耗。
我们看一下下面这个图,当clk为高的时候,其取反为0,则latch的输出不变,这样可以避免输入的Enable的变化影响到clock out。当clk为低的时候,则可以决定下个周期的时钟是否要变化。

然后是时序单元。最最典型的就是寄存器。大家掌握好就够了。下面这个寄存器连了个MUX,是用来做DFT的,感兴趣的朋友自己搜一下,这里不展开。

我们再看一下Level Shifters。这个单元可以进行电压域的转换。

然后是一些物理单元。比如典型的Fillers,其用于填充空的地方。为了确保布局的完整性和性能,有时需要在行的边界处使用特殊的单元,这些单元被称为“端帽单元”(End Caps Cells)。端帽单元的作用是填充行之间的空隙,并提供额外的电气连接。这些单元的放置有助于改善布局的连通性和性能。
此外,为了提高电压的稳定性,设计者有时会在电源和地之间放置MOS电容器(MOSCAPs),这些单元被称为“去耦电容单元”(DeCaps Cells)。去耦电容单元有助于减少电源和地之间的噪声,从而提高电路的稳定性。

我们再来看一下ECO单元。在布局布线以后,RTL通常不会再修改了。有时甚至在Tapeout之后。这种情况下,设计团队可能无法重新创建所有的光刻掩膜(masks),但逻辑有问题还是得修改,这种做法被称为“Metal-Fix”。
ECO通常涉及对逻辑的小规模修改,但如何在布局和布线之后或甚至芯片制带之后进行这些修改呢?解决方案是使用备用(Bonus)单元!备用单元是在设计过程中添加的,它们没有实际的逻辑功能。这些单元在布局和布线过程中被用来填充空间,以便在制造过程中可以重新赋予它们所需的功能。
通过使用备用单元,设计团队可以在布局和布线之后甚至芯片制带之后对设计进行必要的修改,而无需重新创建所有的光刻掩膜。

我们大概了解了什么是Cell。我们在设计的时候,真的要对这些Cell一清二楚吗?显然不是的,你写RTL的时候能对时序有个大概的掌控就不错了。你还会去想晶体管级别的东西?利用好抽象的力量,把这些Cell信息变透明。让我们的设计更简单。(当然稍微掌握一点是有好处的)


我们来看一下标准单元库里面都有什么东西。

4、LEF我们看一下LEF文件。LEF文件包含了标准单元在芯片布局中的详细信息,如单元的尺寸、形状、引脚布局等。这些信息对于布局和布线工具至关重要,因为它们需要这些信息来将标准单元放置在芯片上,并确保单元之间的连接正确无误。
LEF文件中的信息可以帮助布局工具决定单元在芯片上的位置,以及它们之间的布线路径。其采用可读的ASCII格式,包含了标准单元的引脚(PIN)的详细信息,这些引脚用于连接到其他单元或外部电路。


我们再来看一下Technology LEF,该文件包含用于布局和布线工具的简化工艺信息。这些文件提供了有关前端工艺和后端工艺的详细信息,包括层堆叠、金属层信息、层间连接、过孔(vias)和层间接触(contacts)等。
大家自己看看图吧,我也不太懂。。。大家可以看看这篇文章:
elon在上学:LEF,DEF 文件以及与 GDS 和 PDK 的关系100 赞同 · 14 评论文章





5、Liberty我们再来看一下.lib文件,其包含单元的时序和功耗特性。这些文件用于静态时序分析(Static Timing Analysis, STA),以确保设计满足时序要求,并优化功耗性能。
我们先来思考个问题,我们怎么知道通过一个逻辑门,需要多长的延迟?如果不知道延迟的话,综合、STA等都是没法做的。(不知道延迟怎么分析时序?)所以,我们需要一个时序模型,用于简化计算。主要包括以下的参数。
.lib文件包含了标准单元的时序、功耗和噪声等特性信息,但每个.lib文件通常只针对一个特定的工艺条件,即所谓的“角点”(corner)。例如,一个.lib文件可能会包含在25°C温度、标准工艺窗口和1.2V供电电压下的时序参数。另一个.lib文件可能会包含在100°C温度、最小工艺窗口和1.2V供电电压下的时序参数。设计团队需要根据设计目标选择合适的.lib文件,以确保设计在不同工艺条件下都能满足性能要求。

以下是Liberty文件中包含的时序数据内容的解释:
Library:
包含整个标准单元库的通用信息,这些信息适用于库中的所有单元;
例如,操作条件、线负载模型、查找表等;
Cell:
包含每个标准单元的特定信息;
例如,单元的功能、面积等;
Pin:
包含每个单元中每个引脚的时序、功耗、电容、泄漏等特性;
这些特性描述了引脚在时序分析中的行为,包括建立时间(setup time)、保持时间(hold time)、切换时间(transition time)等;


Liberty文件中包含了多种时序模型,其中一种时序模型是非线性延迟模型(Non-Linear Delay Model, NLDM)。NLDM 是最基本简单的 .lib,用于描述标准单元在时序分析中的行为。它通过使用一个非线性的延迟模型来更准确地模拟标准单元在实际电路中的时序行为。NLDM模型通常包含以下部分:
Driver Model(驱动模型):
描述了驱动单元的时序行为,包括驱动单元的输出电容、输出电阻等。
例如,使用一个斜坡电压源和一个固定的驱动电阻来模拟驱动单元的时序行为。
Receiver Model(接收模型):
描述了接收单元的时序行为,包括接收单元的输入电容、输入电阻等。
例如,使用最小/最大上升/下降输入电容来模拟接收单元的时序行为。
NLDM模型比传统的线性延迟模型(Linear Delay Model, LDM)更准确地模拟了标准单元的时序行为,尤其是在高速电路设计中。然而,NLDM模型也有一些局限性,例如它不模型电容随信号过渡过程中的变化,因此在超过130nm工艺节点时可能会失去准确性。


CCSM: Synopsys的复合电流源模型,与NLDM不同,它是电流源模型。
ECSM: Cadence的有效电流源模型,与CCSM一样,都是电流源模型,不同的是ECSM是对Liberty的补充(Liberty为SNPS所有),在lib中以V(t)曲线来描述。


我们总结一下,.lib文件中的时序模型通常分为几种类型,包括线性延迟模型(Linear Delay Model, LDM)、非线性延迟模型(Non-Linear Delay Model, NLDM)、常数电流源模型(Constant Current Source, CCS)和指数电流源模型(Exponential Current Source, ECSM)。
上面讲的是时序模型,而Wire Load Models是.lib文件中描述电源和地网络特性的模型。包括电阻和电容,来模拟电源和地网络的传播延迟,这些延迟会影响信号在电源和地网络上的传播时间。

在纳米级技术中,由于缺乏准确性,仅使用线负载模型的综合与后布局(post-layout)之间存在很差的关联性。物理感知综合通过在综合过程中使用物理信息来解决这个问题。因为它可以更准确地估计寄生效应,如延迟、电容和电阻。
Synopsys将其称为“Topographical Mode”,这是Synopsys Design Compiler中的一种模式,它允许设计者在综合过程中使用物理信息。Cadence将其称为“Physical Synthesis”,这是Cadence Innovus中的一种综合技术,它利用物理信息来提高综合的准确性。
物理感知综合基本上在综合器内部运行布局,以获得更准确的寄生估计。可以在没有floorplan的情况下,仅使用.lef文件进行操作。在第一次迭代后,可以将楼层规划.def文件导入综合器,以进一步优化设计。
对于上面的lef和def而言,总体来说,DEF文件负责描述一个IC设计的“哪里”和“怎样”——即组件应该放在哪里,以及如何进行互连。而LEF文件则描述“什么”——即各种组件和层的性质和规格。两者通常需要结合使用,以获得完整和准确的IC设计表示。

6、Other

有关更多的Standard Cell的信息,需要用户自己阅读相关的文档。

对于标准单元库以外的其它IP呢?



系列文章入口——
【芯片设计】SoC 101(一):绪论
【芯片设计】FIFO漫谈(零)从无处不在的FIFO开始说起
【芯片设计】计算机体系结构(一)虚拟内存
【芯片设计】深入理解AMBA总线(零)绪论
【芯片设计】握手协议的介绍与时序说明
【芯片设计】复位那些小事 —— 复位消抖
【芯片设计】快速入门数字芯片设计(一)Introduction
【芯片验证】UVM源码计划(零)下定决心读源码前的自测环节
【芯片设计】异步电路碎碎念(一) 到底什么是异步电路
【芯片设计】从RTL到GDS(一):Introduction
其他文章链接——
【芯片验证】sva_assertion: 15道助力飞升的断言练习
【芯片验证】可能是RTL定向验证的巅峰之作
【芯片验证】RTL仿真中X态行为的传播 —— 从xprop说起
【芯片验证】年轻人的第一个systemVerilog验证环境全工程与解析
【芯片设计】verilog中有符号数和无符号数的本质探究
【芯片设计】论RTL中always语法的消失术
【芯片设计】代码即注释,注释即代码
【芯片设计】700行代码的risc处理器你确实不能要求太多了
入职芯片开发部门后,每天摸鱼之外的时间我们要做些什么呢
如何计算系统的outstanding 和 burst length?
芯片搬砖日常·逼死强迫症的关键词不对齐事件
熟人社会里,一群没有社会价值的局外人

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表