搜索
bottom↓
回复: 12

verilog中阻塞与非阻塞的范围分别是多大?初学者的困惑!

[复制链接]

出0入0汤圆

发表于 2010-4-6 20:01:50 | 显示全部楼层 |阅读模式
在同一个always快内,阻塞型赋值语句是顺序执行的,那么我理解的就是阻塞赋值的作用范围是“一个过程块”。那么非阻塞赋值的作用范围是多大呢?是不是所有(多个)过程块在同一时刻赋值?也就是说先计算所有过程快中的非阻塞型语句右边表达式的值,最后统一赋值,也就是非阻塞的作用范围是整个模块,是不是这样理解的啊?非常疑惑中····

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-4-6 20:11:34 | 显示全部楼层
强烈推荐看书。

(原文件名:数字逻辑基础与Verilog设计(原书第2版).jpg)

出0入0汤圆

 楼主| 发表于 2010-4-6 20:59:25 | 显示全部楼层
回复【1楼】tear086 .COM 缺氧
-----------------------------------------------------------------------

刚重新查了资料,非阻塞应该是在一个过程块内吧。
那么请问下面这个会有竞争冒险吗?

module test(y1,y2,clk,reset);

output  y1,y2;
input   clk,reset;

reg  y1,y2;

always @(posedge clk,posedge reset)
if(reset)
   y1<=0;  //预置值
else   y1<=y2;

always @(posedge clk,posedge reset)
if(reset)
   y2<=1;  //预置值
else   y2<=y1;

endmodule

如果说非阻塞赋值的范围是一个快,那么我理解的是又产生竞争的可能,但是书上说不会。为什么啊
???

出0入17汤圆

发表于 2010-4-6 21:51:19 | 显示全部楼层
VHDL/Verilog语句不是“顺序执行”而是“并行执行的”,这一点初学者特别容易理解错。

出0入0汤圆

发表于 2010-4-7 00:46:04 | 显示全部楼层
程序中的y1,y2都定义成了output,怎么还要对它们进行相互的赋值操作呢
写法有问题!

出0入0汤圆

 楼主| 发表于 2010-4-7 02:11:12 | 显示全部楼层
回复【4楼】asus119
程序中的y1,y2都定义成了output,怎么还要对它们进行相互的赋值操作呢
写法有问题!
-----------------------------------------------------------------------

这是书上的一个测试程序,是故意这样写的,以说明非阻塞赋值的特点。
我的问题是如果两个always块的速度不同步,那么y1,y2的值不就是不确定了吗?为什么书上还说这种写法不会产生竞争呢?

出0入17汤圆

发表于 2010-4-7 11:58:33 | 显示全部楼层
按照LZ的写法,两个always块的速度必须保证同步(即是采用相同的时钟沿):
always @(posedge clk,posedge reset)
写代码的基本规则之一就是不要在两个时钟域内直接交换数据,否则会产生不确定态(metastability)。

要从电路的角度去检查你的代码:y1/y2是两个D触发器,彼此的D端与对方的Q端相连,复位时一个置0,一个置1,复位消除后的值每时钟周期0/1交替变化。

出0入0汤圆

发表于 2010-5-4 19:39:20 | 显示全部楼层
没看出会发生冲突呀。我立即的非阻塞就相当于在赋值与被赋值对象之间隐含一个锁存器,或者应该叫程序上的寄存器来保存赋值变量当前的数值。然后当这个块运行到最后,再按照顺序将那个保存的变量并行的付给各个需要被赋值的变量。因此这个程序应该没有冲突发生。

出0入0汤圆

发表于 2010-5-8 00:00:49 | 显示全部楼层
回复【楼主位】10086RainEr
-----------------------------------------------------------------------

区别很大啊

出0入0汤圆

发表于 2010-5-19 06:56:24 | 显示全部楼层
回复【5楼】10086RainEr  
回复【4楼】asus119
程序中的y1,y2都定义成了output,怎么还要对它们进行相互的赋值操作呢
写法有问题!
-----------------------------------------------------------------------
这是书上的一个测试程序,是故意这样写的,以说明非阻塞赋值的特点。
我的问题是如果两个always块的速度不同步,那么y1,y2的值不就是不确定了吗?为什么书上还说这种写法不会产生竞争呢?
-----------------------------------------------------------------------

个人觉得,always块的速度不同步,这句话是不是有问题,他们应该是同步执行(在这两个触发条件下posedge clk,posedge reset),应该不会有你认为的组合逻辑条件下,门电路传输时间差异产生的竞争。

出0入0汤圆

发表于 2010-5-19 07:54:38 | 显示全部楼层
阻塞与非阻塞,理解定义是没有意义的。

从某种程度的总结

RTL级的设计都是用 <=

eg.二级状态机写法
  
  reg [3:0]Current;
  reg [3:0]Next;

  always @ ( posedge CLK or negedge RSTn )
     if( !RSTn )
        Current <= 4'd0;
     else
        Current <= Next;

  always @ ( posedege CLK negedge RSTn )
     if( !RSTn )
        Next <= 4'd0;
     else
        case ( Current )
            ***: Next <= Current;
            ......

组合逻辑和连线都是用 =

eg: 多路选择:

module demux
(
   SE, Data_Out;
)
    input [1:0]SE;
    output [3:0]Data_Out;

always @ ( SE )
   case ( SE )
      2'd0: Data_Out = 4'd0;
      2'd1: Data_Out = 4'd1;
      ......

eg:接线

module XXX
(
    Start_Sig, Done_Sig
);

   input Start_Sig;
   output Done_Sig;

   ....

   wire isStart = Start_Sig;

   ....
   reg rDone;

   assign Done_Sig = rDone;

/************************************/

入门就先这样理解吧。
以后有经验了,就会明白的

出0入0汤圆

发表于 2010-6-19 21:36:25 | 显示全部楼层
书在那里?数字逻辑基础与Verilog设计(原书第2版).

出0入0汤圆

发表于 2010-6-19 22:55:11 | 显示全部楼层
多谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 17:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表