2023-01-24 12:46:22 +03:00
|
|
|
`timescale 1 ns/1 ns
|
|
|
|
|
|
|
|
module dec_tb();
|
|
|
|
|
|
|
|
// Wires and variables to connect to UUT (unit under test)
|
|
|
|
logic clk, clrn, train;
|
|
|
|
logic r, y, g;
|
|
|
|
logic [1:0] div;
|
|
|
|
logic ctl_wr, ctl_rd;
|
|
|
|
logic ctl_addr;
|
|
|
|
logic [31:0] ctl_wrdata;
|
|
|
|
logic [31:0] ctl_rddata;
|
|
|
|
logic ram_wr;
|
|
|
|
logic [1:0] ram_addr;
|
|
|
|
logic [31:0] ram_wrdata;
|
|
|
|
|
|
|
|
logic [31:0] divisor[3:0] = {
|
|
|
|
{8'd11, 8'd71, 8'd51, 8'd21},
|
|
|
|
{8'd11, 8'd31, 8'd41, 8'd31},
|
|
|
|
{8'd11, 8'd31, 8'd11, 8'd101},
|
|
|
|
{8'd11, 8'd61, 8'd81, 8'd51}
|
|
|
|
};
|
|
|
|
|
|
|
|
// Instantiate UUT
|
|
|
|
dec my_sem(
|
|
|
|
.clk(clk), .clrn(clrn),
|
|
|
|
.ctl_wr(ctl_wr), .ctl_rd(ctl_rd),
|
|
|
|
.ctl_addr(ctl_addr), .ctl_wrdata(ctl_wrdata), .ctl_rddata(ctl_rddata),
|
|
|
|
.ram_wr(ram_wr),
|
|
|
|
.ram_addr(ram_addr), .ram_wrdata(ram_wrdata),
|
|
|
|
.train(train), .red(r), .yellow(y), .green(g)
|
|
|
|
);
|
|
|
|
|
|
|
|
// Clock definition
|
|
|
|
initial begin
|
|
|
|
clk = 0;
|
|
|
|
forever #10 clk = ~clk;
|
|
|
|
end
|
|
|
|
|
|
|
|
// Divisor and train definition
|
|
|
|
initial begin
|
|
|
|
//initial reset
|
|
|
|
clrn = 0;
|
|
|
|
div = 0;
|
|
|
|
train = 0;
|
|
|
|
//take reset off
|
|
|
|
@(negedge clk) clrn = 1;
|
|
|
|
//configure semaphore
|
|
|
|
for (int i=0; i<4; i++) write_ram_transaction(i,divisor[i]); //write divisor RAM
|
|
|
|
write_reg_transaction(1,div); //write initial divisor
|
|
|
|
write_reg_transaction(0,1); //enable semaphore
|
|
|
|
//run trains
|
|
|
|
repeat (4)
|
|
|
|
begin
|
|
|
|
repeat (10) @(posedge clk);
|
|
|
|
train=1;
|
|
|
|
repeat (4) @(posedge clk);
|
|
|
|
train=0;
|
|
|
|
wait ({r,y,g}==3'b001);
|
|
|
|
repeat (10) @(posedge clk);
|
|
|
|
write_reg_transaction(1,div);
|
|
|
|
div=div+1;
|
|
|
|
end
|
|
|
|
//wait a little
|
|
|
|
repeat (10) @(posedge clk);
|
|
|
|
$stop;
|
|
|
|
end
|
|
|
|
|
|
|
|
//Single register write transaction task
|
|
|
|
task write_reg_transaction;
|
|
|
|
//input signals
|
|
|
|
input [1:0] offs;
|
|
|
|
input [31:0] val;
|
|
|
|
//transaction implementation
|
|
|
|
begin
|
|
|
|
@(posedge clk);
|
|
|
|
//assert signals for one clock cycle
|
|
|
|
ctl_wr = 1;
|
|
|
|
ctl_addr = offs;
|
|
|
|
ctl_wrdata = val;
|
|
|
|
@(posedge clk);
|
|
|
|
//deassert signals
|
|
|
|
ctl_wr = 0;
|
|
|
|
ctl_addr = 'bx;
|
|
|
|
ctl_wrdata = 'bx;
|
|
|
|
end
|
|
|
|
endtask
|
|
|
|
|
|
|
|
//Single register read transaction task
|
|
|
|
task read_reg_transaction;
|
|
|
|
//input signals
|
|
|
|
input [1:0] offs;
|
|
|
|
output [31:0] val;
|
|
|
|
//transaction implementation
|
|
|
|
begin
|
|
|
|
@(posedge clk);
|
|
|
|
//assert signals for one clock cycle
|
|
|
|
ctl_rd = 1;
|
|
|
|
ctl_addr = offs;
|
|
|
|
@(posedge clk);
|
|
|
|
val = ctl_rddata;
|
|
|
|
//deassert signals
|
|
|
|
ctl_rd = 0;
|
|
|
|
ctl_addr = 'bx;
|
|
|
|
end
|
|
|
|
endtask
|
|
|
|
|
|
|
|
//RAM write transaction task
|
|
|
|
task write_ram_transaction;
|
|
|
|
//input signals
|
|
|
|
input [1:0] offs;
|
|
|
|
input [31:0] val;
|
|
|
|
//transaction implementation
|
|
|
|
begin
|
|
|
|
@(posedge clk);
|
|
|
|
//assert signals for one clock cycle
|
|
|
|
ram_wr = 1;
|
|
|
|
ram_addr = offs;
|
|
|
|
ram_wrdata = val;
|
|
|
|
@(posedge clk);
|
|
|
|
//deassert signals
|
|
|
|
ram_wr = 0;
|
|
|
|
ram_addr = 'bx;
|
|
|
|
ram_wrdata = 'bx;
|
|
|
|
end
|
|
|
|
endtask
|
|
|
|
|
|
|
|
endmodule
|