https://mp.weixin.qq.com/s/mH84421WDGRb7cuU5FEFIQ

Verilog的赋值很是复杂,包括:

1. Continuous assignment;

2. Procedural assignment:

a. Blocking Assignment;

b. Non-bocking Assignment(NBA);

但其实没有必要,理解起来也可以很简单;

比如Continuous assignment是针对wire而言,wire需要的是driven,而不是assign,驱动(driven)是物里

的概念,而赋值是编程的概念;

这个连续指的不是值的变化,而是assign这个动作。比如assign wireA = wireB,不是这一次把wireB的值赋值给wireA,而是以后wireA的值都跟随wireB的值的变化而变化。所以可以理解为driven和连接。也因此continous assignment只能针对wire使用。

Procedural Assignment针对寄存器使用,值的就是赋值,因为reg可以存值。因此称为过程性(Procedural),赋值之后就结束了。

那为什么还需要blocking和Non-blocking呢?

可能是要处理多个寄存器之间的赋值问题。

CASE 1(https://blog.csdn.net/chief_cf/article/details/52373831):

always@(posedge clk)
begin
b <= a;
c <= b;
end

这个的写法可以改成:

always@(posedge clk)
begin
c = b;
b = a;
end

具体综合成什么电路,就交给综合器。

CASE 2(值交换):

always@(posedge clk)
begin
b <= a;
a <= b;
end

我不清楚具体综合出的电路是什么样的,但是写法可以改成:

always@(posedge clk)
begin
tmp = b;
b = a;
a = tmp;
end

也不需要非阻塞赋值;

CASE 3:

always @(posedge clk)
begin
a <= u&v&w;
b <= x|y|z;
end

这种写法提倡拆分成两个always语句块,每个处理一个独立的逻辑:

always @(posedge clk)
begin
a = u&v&w;
end always @(posedge clk)
begin
b = x|y|z;
end

什么意思呢?就是要化简建模的方法论(Methodology):

只需要处理wire和reg的assignment即可。

不需要为多个wire之间怎么assign,多个reg之间怎么assign再提供新的机制了。这样的Methodology最简单。

事实上,可以看到新出的建模方法,无论是SystemC还是Chisel,都没有Non-blocking Assignment的概念。

Verilog可以在Gate and Switch层进行建模,也可以在RTL层进行建模。

这个NBA应该属于RTL层的概念,因为他使用的是reg这个数据类型,而不是DFF这个结构。

RTL层是一个抽象层次,所以我觉得使用RTL进行建模时,应当尽量使用这个抽象层次的语法结构。

至于如何综合成最终的电路,则交给综合器去做。我认为综合器是可以把CASE 2中的reg tmp给优化掉的。

打一个比方:如果坐在汽车里面,就只需要踩油门就行了。没必要再从底盘上开两个洞,把脚伸下去用脚划拉,还要拖着车,反受其累。

当然,如果Verilog的RTL不是汽车,而是自行车,屁股坐在上面,还是要用脚踩,那就是另一回事了。这个意思是说,Verilog的RTL确实有必须要NBA来表达的模型。

如果没有NBA,那么Assignment只有两种:用于wire的continous assignment和用于reg的procedural assignment,相当好理解。增加了Non-Blocking Assignment之后就大大的复杂化了。

如果需要把DFF拆开看值的传递,则层次处在Gate and Switch层,这个时候考虑a和b值交换不需要临时变量是何时的。

如果在RTL层,DFF已经被抽象出来了,是一个简单的reg变量。就像物理题里面一个物体被抽象成了一个点,那他的长宽高就不需要再考虑了。

非阻塞赋值(Non-blocking Assignment)是个伪需求的更多相关文章

  1. 非阻塞赋值(Non-blocking Assignment)是个伪需求(2)

    https://mp.weixin.qq.com/s/5NWvdK3T2X4dtyRqtNrBbg   13hope: 个人理解,Verilog本身只是“建模”语言.具体到阻塞/非阻塞,只规定了两种赋 ...

  2. 【Verilog HDL】赋值语句之阻塞赋值方式与非阻塞赋值方式

    刚开始接触Verilog HDL语言时,这种硬件描述语言有一点与软件的程序设计语言直观上的最大区别大概就是这个赋值语句了(这里只是强调直观上的最大区别,事实上的最大区别并非如此). Verilog H ...

  3. FPGA之阻塞赋值与非阻塞赋值

    Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续 ...

  4. Verilog之阻塞赋值非阻塞赋值

    verilog设计进阶 时间:2014年5月6日星期二 主要收获: 1. 阻塞赋值与非阻塞赋值: 2. 代码测试: 3. 组合逻辑电路和时序逻辑电路. 阻塞赋值与非阻塞赋值: 1. 阻塞赋值" ...

  5. 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献   实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理:     阻塞赋值,操作符为"=","阻塞"是指在进程语句( ...

  6. 阻塞赋值与非阻塞赋值(verilog篇)

    阻塞赋值与非阻塞赋值(verilog篇) 2017-09-30 竹海 相约电子ee 相信刚刚接触verilog的读者,多少对阻塞赋值和非阻塞赋值仍有一些困惑.笔者在这篇文章,带领大家深入的理解这两者的 ...

  7. 阻塞赋值-非阻塞赋值(LUT,FDC,BUF...)

    一.看RTL级综合网络 1.1 FDC FDPE FDRE FDSE均是XILINX FPGA片上资源中四种不同的触发器,具体功能可直接百度 1.2 LUT是实现组合逻辑功能的一张真值表,根据输入值直 ...

  8. stm32中阻塞模式和非阻塞模式 in blocking mode 与 in non-blocking mode区别

    阻塞模式和非阻塞模式...... 我的理解是:阻塞模式就像是一个延时函数,当这个函数没处理完那么,所有的按照流程需要执行的代码都不会被执行,要等到这个延时完成,类似 平时看书上写的LED灯闪烁,用的d ...

  9. verilog阻塞与非阻塞的初步理解(二)

    将阻塞模块改为下述代码: module blocking(clk,a,b,c); :] a; input clk; :] b,c; :] b,c; always @(posedge clk) begi ...

随机推荐

  1. 02_互联网基本原理和HTML入门

    上节课的知识复习 互联网的原理:服务器.浏览器.HTTP.知道网页文件是真实的物理存在,用HTTP请求这个文件. 要知道网址的含义:http://www.iqianduan.cn/aaa 请求哪个文件 ...

  2. MySQL 入门(3):事务隔离

    摘要 在这一篇内容中,我将从事务是什么开始,聊一聊事务的必要性. 然后,介绍一下在InnoDB中,四种不同级别的事务隔离,能解决什么问题,以及会带来什么问题. 最后,我会介绍一下InnoDB解决高并发 ...

  3. 【编程之美】常用于单片机的接口适配器模式C语言实现

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/128750 ...

  4. python入门及数字、字符串类型

    目录 python开发框架 开发 1. 开发语言 2. 语言比对 3. python安装 4. Python开发IDE:pycharm ,eclipse python入门 1. 第一句Python 2 ...

  5. Nginx下的location,upstream,rewrite 和 proxy_pass使用总计大全

    一 . location: 顾名思义-->地址,也叫路由. nginx服务器非常核心的配置,一般nginx运维人员在修改nginx配置时,大部分也是围绕着location这个配置进行修改. 下面 ...

  6. Java Web项目部署到阿里云服务器(ECS)

    本篇随笔只是记录博主第一次将自己的Java项目部署到阿里云服务器的大致过程,具体细节还请参考别的博文. 一.项目介绍 我做的项目是利用maven项目构建工具进行搭建基于SSM框架的代码共享管理系统,主 ...

  7. PG 更新统计信息

    http://blog.chinaunix.net/uid-24774106-id-3802225.html 一.vacuum的效果: 1.1释放,再利用 更新/删除的行所占据的磁盘空间. 第一点的原 ...

  8. NPOI导入excel为datatable (xls xlsx xlsm)

    使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中 http://www.cnblogs.com/songrun/p/3547738.html NPOI 2.0教程 – 自动 ...

  9. 安卓网络编程学习(1)——java原生网络编程(2)

    写在前面 该博客紧接上篇博客:https://www.cnblogs.com/wushenjiang/p/12937531.html,继续学习post请求,带参数的post和get请求以及文件上传与下 ...

  10. Spring 基于设值函数(setter方法)的依赖注入

    当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后,通过容器在你的 bean 上调用设值函数,基于设值函数的 DI 就完成了. 下述例子显示了一个类 Text ...