2014-11-14 2 views
0

У меня проблема при моделировании моей системы с помощью скамьи verilog. У меня есть сигнал (clk_out), из которого я хочу измерять и автоматически проверять период и как высокое, так и низкое время. Сигнал clk_out имеет период в 1 секунду, а максимальное время и время - 500 мс.определение сроков в modelsim

`timescale 1ms/1ps 

module tb; 

parameter PASSED = 1; 
parameter FAILED = 0; 

wire clk_out; 
reg reset_n; 
reg result; 
realtime time1; 
realtime time2; 
realtime time3; 


initial begin 
result   = PASSED; 
reset_n   = 1'b0; 

// stay in reset for 100ms 
reset_n = #100 1'b1; 

@(negedge clk_out); 
time1 = $realtime; 
@(posedge clk_out); 
time2 = $realtime; 
@(negedge clk_out); 
time3 = $realtime; 

$display("\n"); 
$display("period is %f, high time is %f, and low time is %f",time3-time1,time3-time2,time2-time1); 
$display("\n"); 

if (time3-time1 <= 999 || time3-time1 >= 1001) begin 
    result = FAILED; 
end 

if (time2-time1 <= time3*0.998/2 || time2-time1 >= time3*1.002/2) begin 
    result = FAILED; 
end 

if (time3-time2 <= time3*0.998/2 || time3-time2 >= time3*1.002/2) begin 
    result = FAILED; 
end 

$display("\n"); 
$display("================================================="); 
if (result) begin 
$display("Test is PASSED"); 
end else begin 
$display("Test is FAILED"); 
end 

// create the 1Hz signal when not in reset 
my_module my_module_under_test 
(
    .RESET_N (reset_n), 
    .CLK_OUT (clk_out) 
); 

выход ModelSim выглядит следующим образом:

период 1000000000,000000, высокое время +500000000,000000, и низкое время 500000000,000000

============= ====================================

тест провален

=== ============ КОНЕЦ МОДЕЛИРОВАНИЯ ===============

Похоже, что временная шкала, определяемая в верхней части файла, не считывается симулятором. Я ожидал иметь:

time3 - time1 = 1000.00000

time2 - time1 = 500.00000

time3 - time2 = 500.00000

Что я делаю неправильно?

Благодаря

+0

Отправьте свой код для my_module, чтобы мы могли видеть, как выглядит clk_out. – toolic

ответ

0

Я преобразовал свой код на себя содержащиеся испытания, не my_module, на EDA Playground.

Он выводится так, как вы ожидали.

# time3-time1 : 1000.000000 
# time3-time2 : 500.000000 
# time2-time1 : 500.000000 

Если ты еще имея вопрос, который я хотел бы предложить, есть проблема в my_module, что часы не работает на нужной частоте.

Советы:
1) Я хотел бы изменить ваши претендуют ваш сброс от:

// stay in reset for 100ms 
reset_n = #100 1'b1; 

в

// stay in reset for 100ms 
#100ms reset_n = 1'b1; 

Последняя версия будет последовательно ждать 100мса затем отпустить сброс, перед тем переходя к остальной части тестовой программы.

2) Если ваш симулятор поддерживает его с помощью спецификаторов времени, вы можете избавиться от временной шкалы. ps pico seconds, ns наносекунды, ms миллисекунды, s секунд.

+0

Привет, На самом деле, я сделал некоторые изменения в my_module, пытаясь отладить его, и у меня была ошибка. Я полностью забыл удалить эти изменения. Ошибка была: я изменил временную шкалу, но не число в кодовой строке, поэтому частота clk_out была неправильной. спасибо за ваши советы. – grorel

+0

@grorel думаю, что мы все были там. Поэтому я всегда использую 'ns' и т. Д. – Morgan

0

Две возможности:

  1. Проверить временные рамки, упомянутых выше module my_module(...), модуль будет использовать этот временной масштаб. Если временная шкала не объявлена ​​в файле, то она будет использовать самую последнюю объявленную временную шкалу; порядок составления заказов. Если ранее не скомпилированная временная шкала не была объявлена, она будет использовать временные рамки по умолчанию для симуляторов.

  2. если используется опция командной строки -timescale timeunit/timeprecision, то глобальная шкала времени и любое объявление в файлах verilog будут игнорироваться.