assign 定义出来的 是线逻辑
纯组合逻辑
问题一:是并行的
问题二:
assign c[0] = (p[0] & ci) | g[0];
assign c[1] = (p[1] & c[0]) | g[1];
assign c[2] = (p[2] & c[1]) | g[2];
是并行的 但是c[0]) 的变化会导致c[1] 的变化
同样的c[1]) 的变化会导致c[2] 的变化
其实 有类似优先级的关系
在逻辑其中
都是并行的没有错,但是assign是阻塞赋值,“阻塞”即是在当前的赋值完成之前阻塞其他赋值任务,当然有延时语句除外。所以c[0]先赋值,c[0]的值发生变化,激励c[1]变化,c[1]变化触发c[2]变化,所以结果就跟顺序执行的结果一样。
如果换成<= ,就成为时序电路了,为非阻塞赋值,一般需要时钟进行控制。在一个时钟周期起始时刻计算右端表达式的值,在时钟结束时刻将右端表达式的值赋给左端,在这个时间周期内的其它变量的赋值不受影响,即不阻塞执行其它的赋值任务,但是其它变量的赋值操作也不会影响本表达式的计算结果。因此,如果在always里用<=,那么c[0]的值会延迟一个时钟被赋予,c[1]用c[0]变化之前的值进行运算(前提是敏感信号列表中只将时钟列入),以此类推,所有运算操作并行执行。
这些运算顺序与规则,可以简单编写几个测试文件进行测试,观察以后也许理解更为深刻。
如果换成<= ,结果是语法有毛病!~~