【陈H的Verilog学习之路】

陈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.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值