大数跨境
0
0

FPGA设计的灵魂--阻塞赋值与非阻塞赋值的区别

FPGA设计的灵魂--阻塞赋值与非阻塞赋值的区别 至芯
2025-05-21
0

1       阻塞赋值和非阻塞赋值的可综合性

阻塞赋值(Blocking Assignment)和非阻塞赋值(NonBlocking Assignment),是Verilog的一个具有争议,并非常重要的问题。

由于Verilog源与C语言,和民营企业(GDA),在Verilog发展过程中,GDA研发团队将C的一些观点,方法和术语引入到Verilog语言中,其中最具有传奇色彩的就是关于阻塞赋值和非阻塞赋值。

阻塞赋值是C语言的一种进程管理方法,应用进程被调用后,调用线程进行必要的运算从而得到计算结果,这些运算可能需要一些时间,甚至因为错误故障永远没有返回计算结果。当调用线程返回计算结果,应用进程则被挂起(无限等待):

为解决阻塞赋值导致系统死机的问题,C的进程管理推出非阻塞赋值:

Verilog引入阻塞赋值和非阻塞赋值概念后,用于综合目的时,此时阻塞和非阻塞都是描述意义(引用的是输入,驱动的是输出);问题是在非综合目的时,意义完全不同。

Verilog的编译器在处理赋值语句时:

1.将赋值语句左侧信号语句,称为LHSLeft Hand Side

2.将赋值语句右侧信号语句,称为RHSRight Hand Side

3.编译首先处理RHS(综合目的得到对应的电路和信号,非综合目的开始执行仿真运算)

4.编译器的RHS的信号后,赋值给LHS

Verilog的阻塞赋值过程:

Verilog的非阻塞赋值过程:

阻塞和非阻塞的一个设计例子(反馈振荡器fbosc):

1.1  非阻塞赋值

功能仿真截图:

时序仿真截图:

结论:

1.非阻塞赋值

2.RTL视图与代码模型一致

3.功能仿真真实

4.时序仿真正确

1.2  阻塞赋值

功能仿真截图:

时序仿真截图:

总结:

1.行为语句中使用非阻塞赋值和阻塞赋值,用于综合目的,结果均正确(RTL视图正确,时序仿真正确,下板正确)(阻塞和非阻塞不影响综合结果)

2.行为语句中使用非阻塞赋值和阻塞赋值,用于非综合目的(功能仿真和第三方分析),前者正确(非阻塞赋值结果正确),后者错误(阻塞赋值结果错误,称为非真实仿真)

3.支持阻塞赋值观点的学派(原Verilog团队和他们的粉丝),认为Verilog中遵循:电平敏感语句使用阻塞赋值;沿敏感语句使用非阻塞赋值,即可避免上述错误。

4.反对阻塞赋值观点的学派(典型的VHDL团队)认为使用阻塞赋值是多余的,认为所有的行为语句,均应该使用非阻塞赋值。(即无论电平敏感和沿敏感,均使用非阻塞赋值)

当我们在循环行为体always中,如果是开节点(信号敏感表中仅出现星号),循环体语句块中所有的赋值语句,即可以使用阻塞赋值(挺阻派),也可以使用非阻塞赋值(倒阻派)。如果是在闭节点(信号敏感表中出现唯一一个未被引用的沿敏感信号),循环语句块中所有赋值语句,只能使用非阻塞赋值(挺阻派和倒阻派)

也就是说,如果在闭节点循环行为体中,若使用阻塞赋值,必然导致功能仿真错误。(对于倒阻和挺阻都言错)。

当前使用的工具中,Altera/Intel团队,以经典的挺阻派为主,因此,在Quartus中写仿真激励,可以使用阻塞赋值,也可以使用非阻塞赋值。Xilinx团队,则比较现代化,以倒阻派为主,因此,在Vivado中写仿真激励,必须写非阻塞。

🌻亲爱的读者们,今天的分享就到这里啦!如果今天的内容对你有启发

记得点亮右下角的“❤️”或转发给需要的朋友,让温暖传递的更远!

生活或许没有标准答案,但每一次【分享】和【点赞】,都是我们相遇的印记。你最近有哪些感悟或故事?欢迎留言区聊一聊~~~

你的认可,是我们深夜码字的充电桩🔋

明天见!保持好奇,永远鲜活~

🔍关注我们,不错过每一次相遇图片图片图片

扫码领取免费学习资料~~~

往期精彩部分

Xilinx(AMD)厂商Vivado2018.3详细安装教程
FPGA设计的灵魂--状态机之自动售货机(三段式)
DDS信号发生器(第一版)--调幅、调频、调相

【声明】内容源于网络
0
0
至芯
至芯科技关于FPGA信息的交流平台
内容 392
粉丝 0
至芯 至芯科技关于FPGA信息的交流平台
总阅读13
粉丝0
内容392