数据流建模
连续赋值
-
连续赋值语句是verilog数据流建模的基本语句,用于对线网进行赋值。
-
这玩意等价门级描述,却是从更高的抽象角度描述电路。
-
连续赋值语句必须以关键词
assign
开始。 -
连续赋值语句有以下几种特点:
- 左边的值必须是一个标量 / 向量线网 / 标量与向量线网的拼接,这三种里面选一个,它不能是向量或向量寄存器。
- 总是激活状态,只要任意一个操作数发生变化,表达式立即重新计算,重新赋值。
- 操作数可以是标量 / 向量的线网或寄存器 / 函数调用。
- 赋值延迟可以用于控制对线网赋予新值的时间,类似门延迟。
-
举例
//out是线网,in1, in2也是线网 assign out = in1 & in2; // addr是16位向量线网 // addr1_bits, addr2_bits都是16位向量寄存器 assgin addr[15:0] = addr1_bits[15:0] ^ addr2_bits[15:0]; // 拼接 assign { c_out, sum[3:0]} = a[3:0] + b[3:0] + c_in;
隐式连续赋值
-
看到这个隐字,就晓得了,肯定缺了什么。
-
在线网声明的同时,对其进行赋值。线网只能被声明一次,因此隐式连续赋值只能有一次。
// 普通赋值 wire out; assgin out = in1 & in2; // 可等价于 wire out = in1 & in2;
隐式线网声明
-
同理,既然可以隐掉
assgin
,那可以隐掉wire
吗? -
当然也是可以的
// out并未对其做线网声明,仿真器会推断出out是隐式声明的线网 wire in1,in2; assgin out = in1 & in2;
延迟
- 连续赋值语句中的延迟,用于控制任一操作数发生变化到语句左值被赋予新值之间的时间间隔(说白了就是,左边的值什么时候发生变化,这个时间是可以人为定义的)。
- 指定赋值延迟的方法:
- 普通赋值延迟
- 隐式连续赋值延迟
- 线网声明延迟
普通赋值的延迟
- 在连续赋值语句中说明延迟的值,延迟值位于
assgin