2014-11-14 1 views
0

Verilog 벤치에서 시스템을 시뮬레이트하는 동안 문제가 있습니다. 나는주기와 높은 시간과 낮은 시간을 측정하고 자동 점검하기를 원하는 신호 (clk_out)를 가지고있다. 신호 clk_out은 1 초의주기를 가지며, 하이 및 로우 시간은 모두 500ms이다.modelsim의 timescale 정의

기간 1000000000.000000이며, 높은 시간 500000000.000000이며, 낮은 시간 500000000.000000

이다 ============= :

`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을 출력은 다음과 같다 ====================================

테스트 ===

실패한다 ============ 시뮬레이션 끝 ===============

파일 상단에 정의 된 시간계는 시뮬레이터에서 읽지 않은 것으로 보입니다. 나는이 예상 : 내가 잘못 뭐하는 거지

time3 - time1 = 1000.00000

time2 - time1 = 500.00000

time3 - time2 = 500.00000

?

감사

+0

my_module에 대한 코드를 게시하면 clk_out이 어떻게 보이는지 알 수 있습니다. – toolic

답변

0

EDA Playground에 my_module 자체 시험으로 코드를 변환했습니다.

예상대로 출력됩니다.

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

당신은 여전히 ​​문제는 내가 문제가있는 제안을 갖는 경우 시계가 정확한 주파수에서 실행되지 않는 my_module입니다.

팁 : 당신이에서 재설정을 적용하는 방식으로 변경됩니다
1) : 마지막 버전은 순차적으로 다음 리셋을 해제 100ms의 기다리는

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

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

에를하기 전에 테스트 프로그램의 나머지 부분으로 이동합니다.

2) 시간 지정자를 사용하여 시뮬레이터에서 지원하는 경우 시간계에 대한 의존도를 제거하는 데 도움이됩니다. ps 피코 초, ns 나노초, ms 밀리 초, s 초.

+0

안녕하세요, 사실, 그것을 디버깅하는 동안 my_module에서 몇 가지 변경 사항을 만들었으며 오류가있었습니다. 나는 그 변화를 완전히 잊어 버렸다. 오류는 다음과 같습니다. timescale은 변경했으나 코드 행의 번호는 변경하지 않았으므로 clk_out 빈도가 잘못되었습니다. 팁 주셔서 감사합니다. – grorel

+0

@grorel은 우리 모두가 거기에 있었다고 생각합니다. 그래서 지금은 항상'ns' 등을 사용합니다. – Morgan

0

두 가지 가능성 : 시간 척도가 module my_module(...) 위에서 언급

  1. 점검, 모듈은이 시간 척도를 사용합니다. 파일에서 시간 스케일이 선언되지 않으면 가장 최근에 선언 된 시간 스케일이 사용됩니다. 순서 문제를 컴파일. 이전에 컴파일 된 timescale이 선언되지 않으면 시뮬레이터의 기본 timescale을 사용합니다.

  2. 명령 줄 옵션 -timescale timeunit/timeprecision을 사용하면 전역 시간 표시가되며 verilog 파일의 모든 선언은 무시됩니다.