各位大师: 请教一个问题。always @(posedge clk or posedge rst)if (rst) y1 <= 0; // resetelse y1 <= y2;always @(posedge clk or posedge rst)if (rst) y2 <= 1; // preset此处插入许多非阻塞语句。else y2 <= y1;endmodule资料说:左边的REG集中赋值,两个ALWAYS先后顺寻没关系。如果第二个ALWAYS因为插入许多语句,导致执行时间与第一个ALWAYS有大的差异,那么两个ALWAYS的左边的REG更新是在哪个ALWAYS执行完毕更新,是最长时间执行完毕的ALWAYS,然后两个一起更新吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
楼上讲的很对,不要用理解C语言的思维去理解FPGA语句,两者有本质上的区别。
由于FPGA语句最终被综合成电路,所以要以电路的眼光去看待FPGA语句,而不能用C语言的思维去看待。
与C语言的顺序执行不同,FPGA最大的特点就是可以并行执行。这是因为,C语言的执行平台是CPU,所有的C语言语句共用CPU这1个”计算装置“,所以只有等上一条C语言执行完了,CPU“空”出来,下一条语句才能开始执行;而每条FPGA语句在FPGA内部都对应于各自的电路结构,相当于每条FPGA语句都有各自的“计算装置“,所以可以同时执行。
在verilog中,所有的always块并行执行,always块内的非阻塞赋值语句也是并行执行。资料中说的的集中赋值,实际上是说在时钟上升沿,所有reg同时赋值;楼主所谓的执行时间,可能是想把所有非阻塞赋值语句的执行时间给加起来,而事实上,对于非阻塞赋值语句而言,所有语句是同时执行的,而且,不论右侧的计算是否执行完,当时钟上升沿到来之时,左侧reg的赋值都会执行,只是此时会产生时序错误罢了。
一周热门 更多>