我们从2011年坚守至今,只想做纯粹的技术论坛,请不要发布和技术无关的话题。  本站有两万多份高大上的PCB和原理图下载,每日更新中,欢迎常回来看看

 找回密码
 立即注册
搜索
查看: 1040|回复: 0

[技术讨论] Verilog 里面,always,assign和always@(*)区别

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:73
  • 打卡月天数:0
  • 打卡总奖励:231
  • 最近打卡:2026-09-20 11:08:12

752

主题

3051

回帖

2432

积分

PADS20220105初级班

积分
2432

终身成就奖特殊贡献奖原创先锋奖

发表于 2021-5-12 17:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

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

而一般时序逻辑要写成
    [li][/li]
always@(posedge clk or negedge rst)
时钟信号clk上升沿或者复位信号rst下降沿的时候执行always块内的代码。

assign 用于描述组合逻辑always@(敏感事件列表) 用于描述时序逻辑敏感事件 上升沿 posedge,下降沿 negedge,或电平敏感事件列表中可以包含多个敏感事件,但不可以同时包括电平敏感事件和边沿敏感事件,也不可以同时包括同一个信号的上升沿和下降沿,这两个事件可以合并为一个电平敏感事件。在新的verilog2001中“,”和“or”都可以用来分割敏感事件了,可以用“*”代表所有输入信号,这可以防止遗漏。合法的写法:
    [li][/li]
always@ *
    [li][/li]
always@ (posedge clk1,negedge clk2)
    [li][/li]
always@ (a or b)
    [li][/li][li][/li]
`timescale 100ns/100ns //定义仿真基本周期为100nsalways #1 clk=~clk //#1代表一个仿真周期即100ns
所有的assign 和 always 块都是并行发生的!并行块、顺序块将要并行执行的语句写在
    [li][/li][li][/li][li][/li]
fork//语句并行执行join
将要顺序执行的语句写在
    [li][/li][li][/li][li][/li]
begin//语句顺序执行end
并行块和顺序块都可以写在initial 或 always@ 之后,也就是说写在块中的语句是时序逻辑的对assign之后不能加块,实现组合逻辑只能用逐句的使用assign组合逻辑如果不考虑门的延时的话当然可以理解为瞬时执行的,因此没有并行和顺序之分,并行和顺序是针对时序逻辑来说的。值得注意的是所有的时序块都是并行执行的。initial块只在信号进入模块后执行1次而always块是由敏感事件作为中断来触发执行的。
2:assign 组合逻辑和always@(*)组合逻辑verilog描述组合逻辑一般常用的有两种:assign赋值语句和always@(*)语句。两者之间的差别有:    1. 被assign赋值的信号定义为wire型,被always@(*)结构块下的信号定义为reg型,值得注意的是,这里的reg并不是一个真正的触发器,只有敏感列表为上升沿触发的写法才会综合为触发器,在仿真时才具有触发器的特性。    2. 另外一个区别则是更细微的差别:举个例子,
    [li][/li][li][/li][li][/li][li][/li][li][/li]
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一样(本人没有去尝试),但是在功能仿真时就差之千里了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请举报投诉

本站所有资料仅限参考学习交流,PCB原理图源码等所有资料不保证准确没问题,请不要用作生产。否则后果自负。

闽公网安备35062302000276号 | 闽ICP备2024076463号-1 | 论坛技术支持QQ群171867948 | 论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表