module register(input [7:0] inp, input load,clk,clr, output reg [7:0] out);
always@(posedge clk or posedge clr) begin
if(clr)
out <= 8'b00000000;
else if(load)
out<= inp;
end
endmodule
module register_tb;
reg [7:0] inp;
reg load,clk,clr;
wire [7:0] out;
integer count1,count2;
register store(inp,load,clk,clr,out);
initial begin
clk = 1'b0;
repeat(2**10) #10 clk = {$random};
end
initial begin
for(count1 = 0;count1<2**8;count1 = count1 + 1) begin
for(count2 = 0;count2<4;count2 = count2 + 1) begin
{clr,load} = count2;
{inp} = count1;
#10;
end
end
end
endmodule
Estou tentando fazer um registro de 4 bits, mas estou preso neste erro. Não consigo entender por que meu código sempre gera zero. Tentei depurá-lo, mas não consegui encontrar o erro.
Como mostram suas formas de onda,
out
nem sempre é 0; isso muda o valor.Seu código de design parece bom, mas o código do testbench não segue boas práticas para lógica síncrona. É por isso que você obtém uma
out
forma de onda de aparência estranha.Eu recomendo usar um sinal de clock com ciclo de trabalho de 50% e acionar todas as outras entradas do clock usando atribuições sem bloqueio da seguinte maneira:
Ondas:
Você pode ver claramente
out
a mudança de 0 a 5.