本章概述了RTL设计中的挑战,以及我们可以用来简化它们的一些基本技术。
挑战
在RTL设计中的基本挑战是,有很多事情同时发生。硬件设计涉及处理并发性,并发性本身就是一个固有的难题。
此外,在RTL中,我们不仅描述设计的功能,还要描述大量的实现细节。例如,我们定义基本的时钟结构以及复位是同步还是异步的。通过我们编写的RTL代码,决定了将使用锁存器还是触发器。
历史上,我们使用代码结构和编码风格来开发易于综合、容易实现时序收敛并满足功耗和门数约束的代码。代码的清晰度往往是一个次要考虑因素。
随着设计变得越来越复杂,同时描述功能和实现的挑战也变得更加困难。例如,像USB 3.0这样的接口协议涉及多个复杂的算法。尽管我们认为这些算法是对数据包进行操作,但这些是串行接口;我们必须逐位或逐字地实现这些算法。开发正确的算法并同时定义其串行实现是一项复杂的任务。在任何复杂的任务中,最终都会发现将其分成两个独立的任务分别解决会更容易一些。
同时设计功能和实现细节的一个副产品是代码量往往会变得相当大。源代码文件大小常常达到数十页。代码结构通常是为了适应编译器的需求,而不一定是为阅读和调试代码的人类设计的。所有这些导致代码难以分析、审查和调试。
语法错误
另一个副产品
尝试编写对综合友好的代码的另一个副产品是我们最终会得到很多语法上的冗余。例如