问题:为什么得到结果滞后了几个时钟周期
Verilog语言是硬件描述语言,电流通过电路会产生延时。我们通过clk时钟将延时控制在可控的范围内。那么,Verilog延时有什么规律呢?
在此我先给出结论:在always模块中,如果某步操作需要用到之前操作的结果,那么在这一步会产生一个时钟周期的延时。
规避方法是,将某些步骤改成assign,或者用阻塞赋值
下面以两位有符号数乘法举例,说明延时产生的机理以及规避措施
这是无延时乘法器
`timescale 1ns / 1ps
module MULT2(
input clk,
input reset,
input [1:0]a,
input [1:0]b,
output [3:0]z
);
wire [3:0]aa,bb;
reg [7:0]temp0,temp1,temp2,temp3;
wire[7:0]rul;
reg f;
//位扩展
assign aa = {
{2{a[1]}},a};
assign bb = {
{2{b[1]}},b};
always@(posedge clk or posedge reset)
if(reset)
f <= 0;
else
begin
temp0 <= bb[0] ? {
{4{aa[3]}},aa} :8'b0;
temp1 <= bb[1] ? {
{3{aa[3]}},aa,1'b0} :8'b0;
temp2 <= bb[2] ? {
{2{aa[3]}},aa,2'b0} :8'b0;
temp3 <= bb[3] ? {
{1{aa[3]}},aa,3'b0} :8'b0;
f<=1;
end
assign ru

这篇博客探讨了在Verilog硬件描述语言中遇到的延迟问题,特别是在always模块中由于非阻塞赋值导致的结果滞后。作者指出,每个操作间的延时通常是一个时钟周期,并提供了使用assign语句或阻塞赋值来规避延时的方法。通过位扩展和有符号数乘法的例子,解释了延时产生的原因和避免它的技术细节。
最低0.47元/天 解锁文章
2580

被折叠的 条评论
为什么被折叠?



