从一开始讲verilog的时候就已经多次给大家强调verilog是硬件描述语言。这次总结下面向硬件设计的思维,包括硬件设计模式,程序执行顺序,以及时钟是电路有控制者等内容。
图片
- 基本硬件设计模式 ·
读者如果学习了verilog,并且有了一定的实践经验的话应该强烈的感受到,verilog和软件(诸如C/C++)有着本质且明显的差别,是一条不可跨越的鸿沟。所以初学者把C和verilog拿来作比较是完全没用的,甚至会把初学者绕晕,影响学习效率的提高。
虽然verilog比硬件更抽象,但是最终实现的结果就是一堆硬件电路。所以评价一个verilog代码的好坏不是看代码量多少,而是看最终实现的功能和性能(有速度和面积2方面)。假设面积为S,性能为V,定义品质数Q=S/V,Q越小,设计的电路越成功。
评价一个设计者代码水平较高,只是这个设计由硬件向verilog表现形式转换更流畅,合理。一个设计最终实现的性能,很大程度上取决于设计的硬件方案是否高效合理。这是两回事。
也因上述2点,verilog设计不刻意追求代码简洁,合理的设计方法是首先理解要设计的电路,也就是把需求转化为数字电路,对此电路的结构和连接十分清晰,然后再用verilog表达出这段电路。也就是说,verilog只是简化了电路设计的工作量,本质上就是设计数字电路,永远绕不开电路这点!这也决定了不能凭空去想代码,因为只有存在的电路才是可实现的,而存在的代码未必可以变成存在的电路。
大家也应该知道,在没有verilog这种高级语言之前都是用原理图设计,必须先构思好整个电路框架,才能去实现。有了verilog以后这种思路并没有被抛弃,依然需要大家去思考电路结构,只有深入理解了电路本身,才能够有高效的设计。
- 实例说明 ·
世界上没有工作2次就自动停下的触发器,所以下面的电路综合是无法实现的。
repeat(2)@(posedge clk)
d <=x;
虽然上述语法很正确,没有毛病,但是是不现实的,现在的技术或者提供的语言还没有抽象到符合语法的都能直接综合成电路,他比较生硬,没有大家想的那么灵活。
至此可以得出一个基本结论,面向硬件的设计模式,就是要从电路特征和行为来编写代码。
例如上面的电路,要实现触发器只工作2次就停止怎么办呢?这个电路是存在的,只是不存在工作2次就自动停下的触发器,所以控制触发器运行2次后关闭使能就可以了。按照这个思路,原理图如下:
上图触发器输入数据x,输出数据d,触发器和计数器使能端由比较器控制,计数到2的时候,计数器和触发器都不使能,这样触发器就只工作了2次。也可以认为是一个简单的状态机,计数器就是状态控制。具体代码请读者思考,首先用上图思路,再用三段式状态机思路,建议二者都写出来,好好比较综合后的RTL图,并且仿真确保结果正确。
看此文之前请千万很熟悉verilog语法,能区分可综合,不可综合语句。
没有回复内容