顺序逻辑中的Verilog非阻塞语句不会延迟一个时钟

时间:2019-01-29 20:29:25

标签: verilog fpga nonblocking

我正在尝试为我的系统做倒计时。

为此,我对计数器的下一个值进行了组合逻辑 和与时钟同步的顺序逻辑

这是显示此波形的波形。
Waveform

在145ns时,非阻塞无法正常工作。

将下一个值(代码中的cnt_next)直接分配(没有一个时钟延迟)到该值,并使用应该阻塞一个时钟的非阻塞语句(代码中的cnt_reg)分配

我无法理解这种情况。

为什么会这样?以及我该如何解决?

这是我的代码

-counter.v

`timescale 1ns / 1ps

module counter
#(
  parameter WIDTH = 6
)
(
  input aclk,
  input aresetn,
  input en,
  input[WIDTH-1:0] max,
  input init,
  output[WIDTH-1:0] cnt
);

wire res_cnt;
reg[WIDTH-1:0] cnt_reg;
reg[WIDTH-1:0] cnt_next;


assign res_cnt = (cnt_reg==0);
assign cnt = cnt_reg;


always @(posedge aclk, negedge aresetn)
begin
  if (!aresetn)
    cnt_reg <= 'd0;
  else
    cnt_reg <= cnt_next;
end

always @*
begin
  cnt_next = cnt_reg;
  if( res_cnt || init)
    cnt_next = max; 
  else if(en)
    cnt_next = cnt_reg - 1;
end

endmodule

-testbench.v

`include "simul.vh"

module tb_counter();

reg reset;
reg clk;
reg en;
reg [31:0]max;
wire [31:0] cnt;
reg init;


localparam num_iter = 80;
integer i=0;
integer num_clk = 0;

always  #(`clock_period/2) clk = ~clk;

initial begin  
  reset = 0;
  en = 1;
  clk = 0;
  max = 32;
  init = 0;
  #(`clock_period/2)
  #`clock_period 
  reset = 1;
  #(`clock_period*10)
  reset = 0;
  #(`clock_period * 3)
  reset =1;
  en=0;
  max=63;
  init=1;
  #(`clock_period)
  init=0;
  en=1;
  max=2;
  #(`clock_period*5)
  $finish;
end





counter #(
  .WIDTH(32)
  ) u_cnt
(
  .aclk(clk),
  .aresetn(reset),
  .en(en),
  .max(max),
   .init(init),
  .cnt(cnt)
);

endmodule

我需要在不同的时间为此计数器分配不同的最大值

这就是为什么我有初始化信号。

请告诉我为什么?以及如何解决?

先谢谢您。

0 个答案:

没有答案