陈H的Verilog学习之路
1.基础语法部分因为没有开始写,具体的等碰到问题,再添加。
2.学习过程,参考了 知乎添加链接描述这篇的描述,目前在学习菜鸟教程中Verilog教程。
3.因为初学,所以只是做给自己看,注意哦 不知道对错 欢迎指正。
注意点
1.感觉task相比于function会更灵活,而且最好调用task时,使用task automatic 语句会更好,尤其是一个模块内多次调用task时。(这里是菜鸟教程中提到的,但是资源似乎是需要更多,因为可以
用关键字 automatic
来对任务进行声明,那么任务调用时各存储空间就可以动态分配,每个调用的任务都各自独立的对自己独有的地址空间进行操作,而不影响多个相同任务调用时的并发执行。
)
2.初学Verilog ,花了一个下午调一段很简单的对数据异或后储存,却一直出错的程序,感触就是一定要对每一个输入输出都要声明好它的大小,无论是model 还是task 还是function ,因为如果不声明好向量,它就按照1bit算,多了直接截断。
input [3:0] en ;
input en ;
3.竞争和冒险
一般使用时钟同步电路,利用触发器进行打拍延迟,就是将要使用的变量多套一层变量,类似于
din_rvs_r <= din_rvs ; en_r <= en ;
这个赋值让他在只有时序电路上升沿的时候被赋值,这样哪怕en的值比上升沿提前点出现,也会保证en_r 与上升沿近似与同步出现。
4.Verilog 书写规范
在编程时多注意以下几点,也可以避免大多数的竞争与冒险问题。
1)时序电路建模时,用非阻塞赋值。
2)组合逻辑建模时,用阻塞赋值。
3)在同一个 always 块中建立时序和组合逻辑模型时,用非阻塞赋值。
4)在同一个 always 块中不要既使用阻塞赋值又使用非阻塞赋值。
5)不要在多个 always 块中为同一个变量赋值。
6)避免 latch 产生。
6).1 具体见(https://www.runoob.com/w3cnote/verilog-latch.html)
主要是latch会在综合时占用更多资源,所以避免被综合成latch。
因此要避免组合逻辑里出现条件语句 if,case的时候
一个条件是赋值,另一个是存储数据
6).2 在组合逻辑中,如果一个信号的赋值源头有其信号本身,或者判断条件中有其信号本身的逻辑,则也会产生 latch。因为此时信号也需要具有存储功能,但是没有时钟驱动。
因此
1)if-else 或 case 语句,结构一定要完整
2)不要将赋值信号放在赋值源头(c=c;),或条件判断中{if (c==1) c=2;}
3)敏感信号列表建议多用 always@(*)
2022.6.10
5.