verilog语言使用注意事项

1、关于always的一些用法:
  每个always块是并行执行的,故不能含有相同的变量。一个always不能同时对同一个信号的上升沿、下降沿进行触发。

2、关于执行顺序
  各个always块是并行执行的,always块和initial块是并行执行的,begin-end块内是顺序执行的,但是非阻塞赋值(<=)是并行执行的(不等待上一条语句的执行结果),阻塞赋值(=)是顺序执行的。

3、变量类型
  reg型数据保持最后一次赋值,wire型需要持续驱动。
  always中被赋值变量必须为reg(寄存器型)
  assign为连续赋值,对象需定义为wire型。

4、模块例化时
输入端口:
  从模块内部讲,必须为wire型(不进行声明默认为wire型)
  从模块外部讲,输入端口可连接到wire或reg型变量。
输出端口:
  从模块内部讲,可连接到wire或reg型变量。
  从模块外部讲,必须接到wire型。

注:模块内部理解为该模块内需要用到的,模块外部为模块化后与外部连接的端口。

参考:https://zhuanlan.zhihu.com/p/35442938

Verilog使用`initial`语句时,有几个重要的注意事项需要牢记: 1. **仅在仿真中使用**:`initial`语句在硬件描述语言(HDL)中主要用于仿真目的,而不是用于综合(synthesis)。综合工具通常会忽略`initial`语句,因此在设计硬件时不应依赖`initial`语句来实现逻辑功能。 2. **初始化寄存器**:虽然`initial`语句不能用于综合,但它们在仿真中非常有用,特别是用于初始化寄存器。例如: ```verilog reg [7:0] data; initial begin data = 8'h00; end ``` 3. **多个`initial`块**:在一个模块中可以包含多个`initial`块,这些块会按照它们在代码中出现的顺序依次执行。 4. **与`always`块的区别**:`initial`块只执行一次,而`always`块则会在满足特定条件时不断执行。`initial`块适用于一次性初始化,而`always`块适用于描述重复执行的逻辑。 5. **时间控制**:`initial`块内可以使用延迟控制语句(如`#`)来控制执行的时间顺序。例如: ```verilog initial begin #10 data = 8'h01; #20 data = 8'h02; end ``` 6. **仿真初始化**:在仿真开始时,所有`initial`块会按照它们在代码中出现的顺序依次执行,用于初始化仿真环境。 以下是一个简单的示例,展示了`initial`块的使用: ```verilog module test; reg [7:0] data; initial begin data = 8'h00; #10 data = 8'h01; #20 data = 8'h02; end initial begin $monitor("At time %0t, data = %h", $time, data); end endmodule ``` 在这个示例中,`initial`块用于初始化`data`寄存器和监控`data`的值变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值