Были внесены некоторые исправления в код, во-первых, мы должны избавиться от предполагаемых защелок в основных логах c (z и count), заканчивались так:
module serialCounter(w,clk,resetn,z);
input w,clk,resetn;
output reg z;
reg [2:0] CS,NS;
reg [7:0] count;
parameter S0=3'b000, S1=3'b001, S2=3'b010, S3=3'b011, S4=3'b100;
always @(w,CS)
case(CS)
S0:if(w==1)
begin
NS=S1;
end
else
begin
NS=S0;
end
S1:if(w==1)
begin
NS=S2;
end
else
begin
NS=S0;
end
S2:if(w==1)
begin
NS=S2;
end
else
begin
NS=S3;
end
S3:if(w==1)
begin
NS=S4;
end
else
begin
NS=S0;
end
S4:begin NS=S0;end
default: NS=S0;
endcase
always @(posedge clk, negedge resetn)
begin
if(resetn == 0)
CS<=S0;
else
CS<=NS;
end
always @(posedge clk, negedge resetn)
begin
if(resetn == 0)
begin
z<=0;
count<=0;
end
if(CS==S4)
begin
z<=1;
count<=count+1;
end
end
endmodule
Во-вторых, в модуль тестового стенда, resetn никогда не менялся с 0 на 1, так как у нас есть асинхронный сброс с активным низким уровнем, он всегда был в состоянии сброса, также, если вы установите "w" с младшим битом счетчика, он будет переключался каждый цикл. Я изменил его на сдвинутый регистр с битовым счетчиком. Тестовый стенд работал следующим образом:
`timescale 1ns/1ns
module counterTB();
localparam WIDTH = 8;
reg clk,resetn;
reg [2:0] CS,NS;
wire w;
wire z;
wire [WIDTH-1:0] count;
reg [WIDTH-1:0] w_reg;
reg [WIDTH-1:0] w_nxt;
reg [$clog2(WIDTH)-1:0] bit_count;
integer i;
serialCounter sk(.w(w),.clk(clk),.resetn(resetn),.z(z));
initial
begin
resetn = 1'b0;
clk = 1'b0;
CS=3'b000;
w_reg = 0;
w_nxt = 0;
end
//DISABLE RESET
always #10 resetn = 1'b1;
always @ (posedge clk, negedge resetn) begin
if(resetn == 0) begin
w_reg <= 0;
w_nxt <= 1;
bit_count <= 0;
end
else begin
if(bit_count == (WIDTH-1)) begin
if(&w_nxt) begin
$finish;
end
else begin
w_reg <= w_nxt;
w_nxt <= w_nxt + 1;
bit_count <= 0;
end
end
else begin
w_reg <= w_reg >> 1;
bit_count <= bit_count + 1;
end
end
end
assign w = w_reg[0];
always #5 clk = ~clk;
always @(posedge clk, negedge resetn) $monitor("w=%b, z=%b, count=%d, w_reg=%x, w_nxt=%h, bit_count=%d, reset=%b", w,z,sk.count,w_reg,w_nxt,bit_count,resetn);
endmodule
Последняя часть результатов моделирования (считается до 255):
w=0, z=1, count=104, w_reg=fa, w_nxt=fb, bit_count=0, reset=1
w=1, z=1, count=104, w_reg=7d, w_nxt=fb, bit_count=1, reset=1
w=0, z=1, count=104, w_reg=3e, w_nxt=fb, bit_count=2, reset=1
w=1, z=1, count=105, w_reg=1f, w_nxt=fb, bit_count=3, reset=1
w=1, z=1, count=105, w_reg=0f, w_nxt=fb, bit_count=4, reset=1
w=1, z=1, count=105, w_reg=07, w_nxt=fb, bit_count=5, reset=1
w=1, z=1, count=105, w_reg=03, w_nxt=fb, bit_count=6, reset=1
w=1, z=1, count=105, w_reg=01, w_nxt=fb, bit_count=7, reset=1
w=1, z=1, count=105, w_reg=fb, w_nxt=fc, bit_count=0, reset=1
w=1, z=1, count=105, w_reg=7d, w_nxt=fc, bit_count=1, reset=1
w=0, z=1, count=105, w_reg=3e, w_nxt=fc, bit_count=2, reset=1
w=1, z=1, count=105, w_reg=1f, w_nxt=fc, bit_count=3, reset=1
w=1, z=1, count=105, w_reg=0f, w_nxt=fc, bit_count=4, reset=1
w=1, z=1, count=106, w_reg=07, w_nxt=fc, bit_count=5, reset=1
w=1, z=1, count=106, w_reg=03, w_nxt=fc, bit_count=6, reset=1
w=1, z=1, count=106, w_reg=01, w_nxt=fc, bit_count=7, reset=1
w=0, z=1, count=106, w_reg=fc, w_nxt=fd, bit_count=0, reset=1
w=0, z=1, count=106, w_reg=7e, w_nxt=fd, bit_count=1, reset=1
w=1, z=1, count=106, w_reg=3f, w_nxt=fd, bit_count=2, reset=1
w=1, z=1, count=106, w_reg=1f, w_nxt=fd, bit_count=3, reset=1
w=1, z=1, count=106, w_reg=0f, w_nxt=fd, bit_count=4, reset=1
w=1, z=1, count=106, w_reg=07, w_nxt=fd, bit_count=5, reset=1
w=1, z=1, count=106, w_reg=03, w_nxt=fd, bit_count=6, reset=1
w=1, z=1, count=106, w_reg=01, w_nxt=fd, bit_count=7, reset=1
w=1, z=1, count=106, w_reg=fd, w_nxt=fe, bit_count=0, reset=1
w=0, z=1, count=106, w_reg=7e, w_nxt=fe, bit_count=1, reset=1
w=1, z=1, count=106, w_reg=3f, w_nxt=fe, bit_count=2, reset=1
w=1, z=1, count=106, w_reg=1f, w_nxt=fe, bit_count=3, reset=1
w=1, z=1, count=107, w_reg=0f, w_nxt=fe, bit_count=4, reset=1
w=1, z=1, count=107, w_reg=07, w_nxt=fe, bit_count=5, reset=1
w=1, z=1, count=107, w_reg=03, w_nxt=fe, bit_count=6, reset=1
w=1, z=1, count=107, w_reg=01, w_nxt=fe, bit_count=7, reset=1
w=0, z=1, count=107, w_reg=fe, w_nxt=ff, bit_count=0, reset=1
w=1, z=1, count=107, w_reg=7f, w_nxt=ff, bit_count=1, reset=1
w=1, z=1, count=107, w_reg=3f, w_nxt=ff, bit_count=2, reset=1
w=1, z=1, count=108, w_reg=1f, w_nxt=ff, bit_count=3, reset=1
w=1, z=1, count=108, w_reg=0f, w_nxt=ff, bit_count=4, reset=1
w=1, z=1, count=108, w_reg=07, w_nxt=ff, bit_count=5, reset=1
w=1, z=1, count=108, w_reg=03, w_nxt=ff, bit_count=6, reset=1
w=1, z=1, count=108, w_reg=01, w_nxt=ff, bit_count=7, reset=1
w=1, z=1, count=108, w_reg=01, w_nxt=ff, bit_count=7, reset=1