Me han dado una tarea interesante. Mi tarea fue diseñar un contador up_down de 4 bits que tenga dos señales de control, up_down y load. El up_down decide el tiempo en que el contador debe contar hacia arriba o hacia abajo (up_down = 1'b1 up-count y up_down = 1'b0 down-count). La señal de carga es cargar los datos de 4 bits en el contador. Pude diseñar y verificar el código en rtl y en el banco de pruebas.
Pero ahora se me notifica que me asegure de que las señales de entrada de mi banco de pruebas lleguen después de la fecha del reloj en RTL. Eso significa que mis señales de carga y de subida / bajada deben llegar después del límite positivo del reloj RTL. Por favor encuentra mi rtl y testbench. Me piden que haga algo en el banco de pruebas y escriba una lógica en el banco de pruebas para asegurarme de que mis señales lleguen más tarde. Necesitaría ayuda en esto. Por favor, responde.
Mi código RTL:
module up_down_counter(
input clock,
input reset,
input load,
input up_down, //up_down = 1'b1,upcounter; up_down=1'b0,down_counter
input [3:0] data,
output [3:0] counter
);
reg [3:0] counter_reg;
always@(posedge clock or posedge reset)
begin
if(reset == 1'b1)
begin
counter_reg <= 4'b0000;
end
else
begin
if (up_down == 1'b1)
begin
if(load == 1'b1)
begin
counter_reg <= data;
end
else
begin
counter_reg <= counter_reg + 4'b0001;
end
end
else
begin
if(load == 1'b1)
begin
counter_reg <= data;
end
else
begin
counter_reg <= counter_reg - 4'b0001;
end
end
end
end
assign counter = counter_reg;
endmodule
mi banco de pruebas:
module tb_up_down_counter;
reg clock;
reg reset;
wire [3:0] counter;
reg up_down;
reg load;
reg [3:0] data;
up_down_counter dut(
.clock(clock),
.reset(reset),
.load(load),
.data(data),
.up_down(up_down),
.counter(counter)
);
initial
begin
clock = 1'b0;
forever #50 clock = ~clock;
end
initial
begin
reset <= 1'b0;
load <= 1'b0;
up_down <= 1'b0;
data <= 4'd0;
repeat(5)
@(posedge clock);
reset <= 1'b1;
repeat(5)
@(posedge clock);
reset <= 1'b0;
repeat(10)
@(posedge clock);
up_down <= 1'b1;
repeat(5)
@(posedge clock);
load <= 1'b1;
repeat(10)
@(posedge clock);
data <= 4'd3;
repeat(5)
@(posedge clock);
up_down <= 1'b0;
repeat(5)
@(posedge clock);
load <= 1'b0;
repeat(5)
@(posedge clock);
load <= 1'b1;
repeat(10)
@(posedge clock);
data <= 4'd5;
repeat(5)
@(posedge clock);
up_down <= 1'b1;
repeat(5)
@(posedge clock);
reset <= 1'b1;
repeat(10)
@(posedge clock);
reset <= 1'b0;
repeat(10)
@(posedge clock);
load <= 1'b1;
repeat(10)
@(posedge clock);
data <= 4'd8;
repeat(10)
@(posedge clock);
data <= 4'd15;
repeat(10)
@(posedge clock);
data <= 4'd12;
#5000 $finish;
end
initial
begin
$shm_open("waves.shm");
$shm_probe(tb_up_down_counter,"AC");
end
endmodule