Verilog 中的Procedural continuous assignments
Verilog中的赋值方式:
assign 引导的continuous 赋值
用于nets类型的数据,比如wire,左边的值随着右边的值连续变化,可理解为线网, 比如
wire carry_out, sum_out;
wire carry_in, a_in, b_in;
assign {carry_out, sum_out} = a_in + b_in + carry_in;
procedural 赋值
用于variable类型的数据比如reg, integer, real, time 和realtime类型的数据。这种赋值方式一般在always或者initial结构中,或者是在定义的时候也可声明 比如:
reg clk;
always #1; clk = ~clk;
initial clk = 1'b1;
reg test_reg = 1'b1;
具体还有阻塞赋值与非阻塞赋值的区别,这个下次单独总结
还有一种特殊的赋值方式
procedural continuous赋值
这种赋值由 assign/deassign 和 force/release引导
assign / deassign
assign对variable会覆盖掉
主要用于variable或者variable 的拼接,但不能用于variable 的bit select或者 part select
比如说用一个assign引导的procedural continuous写一个带预置位和清零的d触发器
module dff(q, d, clk, clr, preset);
input d;
input clk, clr, preset;
output q;
wire d;
wire clk, clr, preset;
reg q;
always @(preset, clr)begin
if(!clr)
assign q = 0;
else if(!preset)
assign q = 1'b1;
else
deassign q;
end
always @(posedge clk)begin
q = d; // 这里用的是阻塞赋值
end
endmodule
如果clr或者preset为0时,那么时钟的上升沿不会影响到q, 当他们都为高时,q被deassign, 回到正常的procedural 赋值。
至于为什么用阻塞赋值,等我明白了再写。
force / release
force/release 可以用于net, variable, bit-select of vector net, part-select of vector net,或者他们的拼接
force用于variable会覆盖掉过程赋值,或者assign引导的过程连续(procedural assign)赋值,直到release
force用于net会覆盖掉所有net的drive或者continuous assign,直到release
example
module test
reg a, b, c, d;
wire e;
and u_and(e, a, b, d);
initial begin
$monitor(" %d : d = %d, e = %d", $stime, d, e);
assign d = a & b & c;
a = 1;
b= 0;
c = 1;
#10;
force d = (a | b | c); // force右边可以是表达式,只要a, b, c其中一个改变,左边值就会变化
force e = (a | b | c);
#10;
release d;
release e;
#10;
$finish;
end
endmodule
结果
0: d=0; e = 0;
10: d = 1; e = 1; // force 强制变为或
20: d= 0; e = 0;
Verilog 中的Procedural continuous assignments相关推荐
- Verilog初级教程(21)Verilog中的延迟控制语句
文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...
- Verilog初级教程(14)Verilog中的赋值语句
文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...
- FPGA之道(35)Verilog中的并行与串行语句
文章目录 前言 Verilog的并行语句 Verilog连续赋值语句 普通连续赋值语句 条件连续赋值语句 Verilog程序块语句 沿事件 纯组合always 纯时序always 具有同步复位的alw ...
- verilog中数组的定义_开源仿真工具Icarus Verilog中的verilog parser
前面提到用flex和bison开处理命令行参数,回顾一下:开源仿真工具Icarus Verilog中的命令行参数处理方法. 那么Verilog的parser又是怎么实现的呢?简单地说,与做命令行参数的 ...
- FPGA的设计艺术(18)如何使用Verilog中的数组对存储器进行建模?
前言 Verilog中的二维数组很有用,可以使用for以及generate for配合二维数组进行使用,可以代替大量寄存器的场合,其实大量同类寄存器可以使用存储器进行代替,Verilog中可以使用二维 ...
- Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...
- Verilog初级教程(15)Verilog中的阻塞与非阻塞语句
文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...
- Verilog初级教程(12)Verilog中的generate块
文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...
- Verilog初级教程(11)Verilog中的initial块
文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...
- FPGA之道(37)Verilog中的编写注意事项
文章目录 前言 Verilog中的编写注意事项 大小写敏感 Verilog中的关键字 范围定义的正确使用 不要省略begin与end 注释中斜杠的方向 编译指令中的前导符号 混用阻塞和非阻塞赋值的危害 ...
最新文章
- 工作方法及总结(给自己的忠告)
- 打印出所有的 info.plist 中的 keys、values
- IIS6.0下配置HTTP Gzip压缩 提高iis相应速度
- 内部类调用相同属性同名时的调用细节
- python网页优化_python大佬养成计划----JavaScript对html的优化
- Memcached使用手册
- ruby 执行函数_Ruby at()函数
- opencv火焰检测小项目
- uniapp---app端上传证件(身份证/银行卡)照片后转base64发送给后台功能实现
- html 中长单词换行问题
- 告别户外弱网困扰,4G多卡聚合设备增强弱网环境下应急救援信号
- 实验一 linux常用命令
- 51单片机之8×8点阵显示(74HC595)
- Linux tshark安装
- Verilog HDL语言入门(二)
- jQuery学习笔记05
- 三星(samsung)手机i699内容:解锁boot loader,刷recovery,刷机(刷rom),root综合教程
- 项目中用到的数字证书的创建,签名实现
- MySQL 2021-03-29
- 基于Python构建上市公司高送转预测模型