0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你们知道always,assign和always@(*)之间的区别吗

FPGA之家 来源:碎碎思 作者:碎碎思 2021-06-27 11:47 次阅读

1.always@后面内容是敏感变量,always@(*)里面的敏感变量为*,意思是说敏感变量由综合器根据always里面的输入变量自动添加,也就是所有变量都是敏感列表,不用自己考虑。2.如果没有@,那就是不会满足特定条件才执行,而是执行完一次后立马执行下一次,一直重复执行,比如testbench里面产生50Mhz的时钟就(假设时间尺度是1ns)可以写成

always #25 CLK_50Mhz = ~CLK_50Mhz;

一般always@(*)是指里面的语句是组合逻辑的。*代替了敏感变量。

而一般时序逻辑要写成

always@(posedge clk or negedge rst)

时钟信号clk上升沿或者复位信号rst下降沿的时候执行always块内的代码。

assign 用于描述组合逻辑always@(敏感事件列表) 用于描述时序逻辑敏感事件 上升沿 posedge,下降沿 negedge,或电平敏感事件列表中可以包含多个敏感事件,但不可以同时包括电平敏感事件和边沿敏感事件,也不可以同时包括同一个信号的上升沿和下降沿,这两个事件可以合并为一个电平敏感事件。在新的verilog2001中“,”和“or”都可以用来分割敏感事件了,可以用“*”代表所有输入信号,这可以防止遗漏。合法的写法:

always@ *

always@ (posedge clk1,negedge clk2)

always@ (a or b)

`timescale 100ns/100ns //定义仿真基本周期为100nsalways #1 clk=~clk //#1代表一个仿真周期即100ns

所有的assign 和 always 块都是并行发生的!并行块、顺序块将要并行执行的语句写在

fork//语句并行执行join

将要顺序执行的语句写在

begin//语句顺序执行end

并行块和顺序块都可以写在initial 或 always@ 之后,也就是说写在块中的语句是时序逻辑的对assign之后不能加块,实现组合逻辑只能用逐句的使用assign组合逻辑如果不考虑门的延时的话当然可以理解为瞬时执行的,因此没有并行和顺序之分,并行和顺序是针对时序逻辑来说的。值得注意的是所有的时序块都是并行执行的。initial块只在信号进入模块后执行1次而always块是由敏感事件作为中断来触发执行的。

2:assign 组合逻辑和always@(*)组合逻辑verilog描述组合逻辑一般常用的有两种:assign赋值语句和always@(*)语句。两者之间的差别有: 1. 被assign赋值的信号定义为wire型,被always@(*)结构块下的信号定义为reg型,值得注意的是,这里的reg并不是一个真正的触发器,只有敏感列表为上升沿触发的写法才会综合为触发器,在仿真时才具有触发器的特性。 2. 另外一个区别则是更细微的差别:举个例子,

wire a;reg b;assign a = 1‘b0;always@(*)b = 1’b0;

在这种情况下,做仿真时a将会正常为0, 但是b却是不定态。这是为什么?verilog规定,always@(*)中的*是指该always块内的所有输入信号的变化为敏感列表,也就是仿真时只有当always@(*)块内的输入信号产生变化,该块内描述的信号才会产生变化,而像always@(*) b = 1‘b0; 这种写法由于1’b0一直没有变化,所以b的信号状态一直没有改变。

由于b是组合逻辑输出,所以复位时没有明确的值(不定态),而又因为always@(*)块内没有敏感信号变化,因此b的信号状态一直保持为不定态。事实上该语句的综合结果有可能跟assign一样(本人没有去尝试),但是在功能仿真时就差之千里了。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 触发器
    +关注

    关注

    14

    文章

    1676

    浏览量

    60391
  • 综合器
    +关注

    关注

    0

    文章

    8

    浏览量

    6381
  • CLK
    CLK
    +关注

    关注

    0

    文章

    122

    浏览量

    16902

原文标题:Verilog 里面,always,assign和always@(*)区别

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    assign语句和always语句的用法

    Assign语句和Always语句是在硬件描述语言(HDL)中常用的两种语句,用于对数字电路建模和设计。Assign语句用于连续赋值,而Always语句用于时序逻辑建模。本文将详细探讨
    的头像 发表于 02-22 16:24 468次阅读

    知道光纤尾纤和光纤跳线的区别吗?

    知道光纤尾纤和光纤跳线的区别吗? 光纤尾纤和光纤跳线是两种常见的光纤连接组件,它们在光纤通信中起到非常关键的作用。虽然它们都是用于连接光纤设备的,但在很多方面有着明显的区别。下面将详细介绍光纤
    的头像 发表于 12-27 16:11 348次阅读

    assign和signed的联合背刺事件

    没想到啊没想到啊,有一天会被浓眉大眼的assign背刺!想当年在always消失术里,在X态分析里,在xprop平替策略里,把assign捧的这么高,优点说了800多项,然后今天一仿真出bug了?!
    的头像 发表于 12-04 11:33 185次阅读
    <b class='flag-5'>assign</b>和signed的联合背刺事件

    什么是always on buffer?什么情况下需要插always on buffer?

    相比普通的buffer cell,always on buffer(AOB)有secondary always on pin,可以让AOB即使在primary power off的情况下保持on的状态;AOB在secondary pg pin off的情况下也是off的。
    的头像 发表于 12-01 15:31 806次阅读
    什么是<b class='flag-5'>always</b> on buffer?什么情况下需要插<b class='flag-5'>always</b> on buffer?

    变压器和电源是不是同一种产品?你知道他们之间有什么区别吗?

    变压器和电源是不是同一种产品?你知道他们之间有什么区别吗? 变压器和电源不是同一种产品,它们在功能和作用上有很大的区别。本文将详细讨论变压器和电源的定义、原理、结构、应用及其
    的头像 发表于 11-20 15:07 1387次阅读

    FPGA与信号频率测量——等精度测频法

    */ reg en;/*实际闸门信号*/ reg[25:0] f_signal_cnt,f_clk_cnt; /*分频产生周期为2s的预置闸门信号*/ always@(posedge clk
    发表于 11-06 14:29

    无源与有源器件的这些区别你都知道吗?

    无源与有源器件的这些区别你都知道吗?
    的头像 发表于 10-26 15:27 4189次阅读
    无源与有源器件的这些<b class='flag-5'>区别</b>你都<b class='flag-5'>知道</b>吗?

    SystemVerilog相比于Verilog的优势

    我们再从对可综合代码的支持角度看看SystemVerilog相比于Verilog的优势。针对硬件设计,SystemVerilog引入了三种进程always_ff,always
    的头像 发表于 10-26 10:05 352次阅读
    SystemVerilog相比于Verilog的优势

    SystemVerilog:处理信号双驱动问题解析

    在SystemVerilog中,类型可以分为线网(net)和变量(variable)。线网的赋值设定与Verilog的要求相同,即线网赋值需要使用连续赋值语句(assign),而不应该出现在过程块(initial/always)中。
    的头像 发表于 10-13 14:53 823次阅读
    SystemVerilog:处理信号双驱动问题解析

    【紫光同创PGL50H】小眼睛科技盘古50K开发板试用体验之图像Sobel边缘检测

    = (rstn_1ms == 16\'h2710); assign pixclk_out = pixclk_in; always @(posedge cfg_clk) begin if(!locked
    发表于 10-12 20:14

    【紫光同创PGL50H】小眼睛科技盘古50K开发板试用体验之图像灰度显示

    rstn_out = (rstn_1ms == 16\'h2710); assign pixclk_out = pixclk_in; always @(posedge cfg_clk
    发表于 10-12 19:03

    FPGA与信号频率测量——等精度测频法

    ,f_clk_cnt; /*分频产生周期为2s的预置闸门信号*/ always@(posedge clk orposedge rst_p) begin if(rst_p) begin div_cnt&
    发表于 09-21 10:08

    高质量VerilogHDL描述方法

    VerilogHDL可综合的四大法宝:always、if-else、case、assign,本文将围绕这四大法宝来讲述。
    的头像 发表于 06-05 15:38 539次阅读
    高质量VerilogHDL描述方法

    always组合逻辑块的讲解和译码器的实现

    always 语句是重复执行的。always 语句块从 0 时刻开始执行其中的行为语句;当执行完最后一条语句后,便再次执行语句块中的第一条语句,如此循环反复。
    的头像 发表于 05-22 15:13 1270次阅读
    <b class='flag-5'>always</b>组合逻辑块的讲解和译码器的实现

    FPGA设计:always组合逻辑块的讲解和译码器的实现

    always 语句是重复执行的。always 语句块从 0 时刻开始执行其中的行为语句;当执行完最后一条语句后,便再次执行语句块中的第一条语句,如此循环反复。多用于仿真时钟的产生,信号行为的检测等。
    的头像 发表于 05-12 14:42 2476次阅读
    FPGA设计:<b class='flag-5'>always</b>组合逻辑块的讲解和译码器的实现