Оператор неблокирования Verilog в последовательной логике не задерживается на один такт - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь уменьшить счетчик для моей системы.

Для этого я создал комбинационную логику для счетчика следующего значения и последовательную логику для синхронизации с часами

Вот форма волны, чтобы показать это.
Форма волны

при 145 нс, неблокирование не работает должным образом.

Следующее значение (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

Iнеобходимо назначить разное максимальное значение этому счетчику в разное время

, поэтому у меня есть сигнал инициализации.

Скажите, пожалуйста, почему?и как это исправить?

Заранее спасибо.

...