对于以下代码,这是一个7段59秒计数器,我正在尝试实现一个测试平台。我有两个问题:一个是我使用q [24]作为实习时钟使其计算大约秒,但在测试平台中我应该能够看到不同的输出而不实现数千个时钟。另一个麻烦是我想在测试平台中看到寄存器[3:0] unidad和[3:0] decena的输出,它们是7段面板上的每个数字,但在代码中没有使用如输入或输出,但作为实习变量。
如何在合理的时间内实现显示decena / unidad输出的模拟?感谢。
module cont(
input clock,
input reset,
output reg [6:0]segm,
output [3:0]an
);
reg [3:0]unidad;
reg [3:0]decena;
reg [24:0] q;
always @(posedge clock or posedge reset)
begin
if(reset == 1)
q <= 0;
else
q <= q + 1;
end
always @ (posedge q[24] or posedge reset)
begin
if (reset) begin
unidad <= 0;
decena <= 0;
end
else if (unidad==4'd9)
begin
unidad <= 0;
if (decena==4'd5)
decena <= 0;
else
decena <= decena + 1;
end
else
unidad <= unidad + 1;
end
reg [6:0]sseg;
reg [3:0]an_temp;
always @ (*)
begin
case(q[13])
1'b0 :
begin
sseg = unidad;
an_temp = 4'b1110;
end
1'b1 :
begin
sseg = decena;
an_temp = 4'b1101;
end
endcase
end
assign an = an_temp;
always @ (*)
begin
case(sseg)
4'd0 : segm = 7'b1000000; //0
4'd1 : segm = 7'b1111001; //1
4'd2 : segm = 7'b0100100; //2
4'd3 : segm = 7'b0110000; //3
4'd4 : segm = 7'b0011001; //4
4'd5 : segm = 7'b0010010; //5
4'd6 : segm = 7'b0000010; //6
4'd7 : segm = 7'b1111000; //7
4'd8 : segm = 7'b0000000; //8
4'd9 : segm = 7'b0010000; //9
default : segm = 7'b1111111;
endcase
end
endmodule
答案 0 :(得分:0)
您可以强制计数器更接近测试平台中感兴趣的值。 你可以通过两种风格来实现。
1)强制计数器接近您感兴趣的值并产生一些时钟周期。
2)强制你感兴趣的位并等待一些时钟周期。
在这种情况下,'h1000和'h1000000的值是感兴趣的或位24和13。
// function to set the register - replace <DUT>
task load_counter ( reg [24:0] val );
#1 <DUT>.q = val ; //delay is to overwrite the main counter
endtask
或
// function to set the counter bit - replace <DUT>
task count_up ( int count,int loc , bit val);
repeat(count) @(posedge clock ) ;
#1 <DUT>.q[loc] = val; //delay is to overwrite the main counter
endtask
// toggle bit 24 and in between toggle bit 13 based on counts.
// 100 clock is just a value it can be changes.
task count_24( int count_24,int count_13);
repeat (count_24)
begin
repeat(count_13)
begin
count_up ( 100,13,1);
count_up ( 100,13,0);
end
count_up ( 1,24,1);
repeat(count_13)
begin
count_up ( 100,13,1);
count_up ( 100,13,0);
end
count_up ( 1,24,0);
end
endtask
在第一种方法中
load_counter(25'hff0);// load and wait for bit 13 to be set
repeat(50) @(posedge clock ) ;
load_counter(25'h1ff0); // load and wait for bit 13 to be re-set.
repeat(50) @(posedge clock ) ;
load_counter(25'hf0ff0); //load and wait for bit 13 set ( while other bits > 13 are on )
repeat(50) @(posedge clock ) ;
load_counter(25'hfffff0); // bit 24 set
repeat(50) @(posedge clock ) ;
// if needed add set/reset for bit 13 code here
load_counter(25'h1fffff0); // load and wait till bit 24 rolls over
repeat(50) @(posedge clock ) ;
// repeat the whole process above in a loop to get desired behavior
您还可以随机化每个24位切换之间需要查看的13位切换次数以及计数器更改之间需要运行的时钟数。
在计划2中
13和24的计数可以由测试作者确定,也可以随机化。
count_24(10,10)
在选项1中,我们让计数器机制完成大部分任务,因此是首选。
但最后还是更好地运行完整的计数器才能看到结果。可能你可以在周末回归时运行它。
您也可以直接观察TB中的信号。
wire [3:0] observe_unidad = <DUT>.unidad;
wire [3:0] observe_decena = <DUT>.decena;
在这里添加tb的完整代码...
// this code will not synthesize
module tb_cont ;
reg clock_gen ; // To generate a clock
reg reset_gen ; // to generate reset
// Main counter instance
cont cont_instance (
.clock(clock_gen),
.reset ( reset_gen)
) ;
// Clock generation block
initial
begin
clock_gen = 0 ;
forever
begin
#10 clock_gen = 0 ;
#10 clock_gen = 1 ;
end
end
// Task to write data in the cont- block
task count_up ( int count,int loc , bit val);
repeat(count) @(posedge clock_gen ) ;
#1 cont_instance.q[loc] = val; //delay is to overwrite themain counter
endtask
/ toggle bit 24 and in between toggle bit 13 based on counts.
// 100 clock is just a value it can be changed.
task count_24( int count_24,int count_13);
repeat (count_24)
begin
repeat(count_13)
begin
count_up ( 100,13,1);
count_up ( 100,13,0);
end
count_up ( 1,24,1);
repeat(count_13)
begin
count_up ( 100,13,1);
count_up ( 100,13,0);
end
count_up ( 1,24,0);
end
endtask
// task to load the counter
task load_counter ( reg [24:0] val );
#1 cont_instance.q = val ; //delay is to overwrite themain counter
endtask
initial
begin
// dump waveform to observe signals
$dumpvars;
// generate a reset first
reset_gen = 0 ;
#100 reset_gen = 0 ;
#100 reset_gen = 1 ;
#100 ;
@(posedge clock_gen ) ;
reset_gen = 0 ;
end
// value for the count
int count13 = 100;
int count24=100;
// generate test vector
initial
begin
repeat( 100 ) @ ( posedge clock_gen ) ; // wait for counter
load_counter(25'hff0);
repeat( 100 ) @ ( posedge clock_gen ) ; // wait for counter
load_counter(25'hfffff0);
repeat( 100 ) @ ( posedge clock_gen ) ; // wait for counter
load_counter(25'h1fffff0);
repeat( 100 ) @ ( posedge clock_gen ) ; // wait for counter
// scheme 2
count_24(10,10);
$finish ;
end
// both the signal can eb observed
wire [3:0] observe_unidad = cont_instance.unidad;
wire [3:0] observe_decena = cont_instance.decena;
endmodule