verilog
Verilog 시뮬레이션은 시뮬레이터가 #1이 시간 측면에서 무엇을 의미하는지 알아야 하기 때문에 시간이 정의되는 방식에 따라 다릅니다. `timescale
컴파일러 지시문은 뒤에 오는 모듈의 시간 단위와 정밀도를 지정합니다.
`timescale <time_unit>/<time_precision>
// Example
`timescale 1ns/1ps
`timescale 10us/100ns
`timescale 10ns/1ns
time_unit time_precision 동안 지연 및 시뮬레이션 시간 측정 시뮬레이션에 사용되기 전에 지연 값이 반올림되는 방법을 지정합니다.
동일한 설계에서 다른 시간 단위를 사용하려면 다음 시간 척도 구성을 사용하십시오. 디자인의 지연 사양은 합성할 수 없으며 하드웨어 논리로 변환할 수 없습니다.
`timescale
기본 측정 단위 및 시간 정확도$time
및 $realtime
시스템 함수는 현재 시간을 반환하고 기본 보고 형식은 다른 시스템 작업 $timeformat
으로 변경할 수 있습니다. .문자 | 단위 |
---|---|
s | 초 |
ms | 밀리초 |
우리 | 마이크로초 |
ns | 나노초 |
ps | 피코초 |
fs | 펨토초 |
이 사양의 정수는 1, 10 또는 100일 수 있으며 단위를 지정하는 문자열은 위의 표에 언급된 모든 값을 사용할 수 있습니다.
// Declare the timescale where time_unit is 1ns
// and time_precision is also 1ns
`timescale 1ns/1ns
module tb;
// To understand the effect of timescale, let us
// drive a signal with some values after some delay
reg val;
initial begin
// Initialize the signal to 0 at time 0 units
val <= 0;
// Advance by 1 time unit, display a message and toggle val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Advance by 0.49 time unit and toggle val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Advance by 0.50 time unit and toggle val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Advance by 0.51 time unit and toggle val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Let simulation run for another 5 time units and exit
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
첫 번째 지연 문은 시뮬레이터가 `timescale
로 1ns로 지정된 정확히 1시간 단위를 기다리게 하는 #1을 사용합니다. 지령. esecond 지연 문은 반 시간 단위보다 작은 0.49를 사용합니다. 그러나 시간 정밀도는 1ns로 지정되므로 시뮬레이터는 1ns보다 작아질 수 없으므로 주어진 지연 문을 반올림하고 0ns를 산출합니다. 따라서 두 번째 지연은 시뮬레이션 시간을 앞당기는 데 실패합니다.
세 번째 지연 문은 정확히 시간 단위 [hl]#0.5[/lh]의 절반을 사용하고 시뮬레이터는 값을 반올림하여 하나의 전체 시간 단위를 나타내는 #1을 얻습니다. 따라서 이것은 T=2ns에서 인쇄됩니다.
네 번째 지연 문은 시간 단위의 절반보다 큰 값을 사용하고 반올림하여 표시 문을 T=3ns에서 인쇄하도록 합니다.
시뮬레이션 로그ncsim> run T=1 At time #1 T=1 At time #0.49 T=2 At time #0.50 T=3 At time #0.51 T=8 End of simulation ncsim: *W,RNQUIE: Simulation is complete.
시뮬레이션은 예상대로 8ns 동안 실행되지만 파형이 각 나노초 사이에 더 작은 분할을 가지지 않는다는 점에 유의하십시오. 시간의 정밀도는 시간 단위와 동일하기 때문입니다.
<노스크립트>만 이전 예제와 비교하여 이 예제에서 변경된 사항은 타임스케일이 1ns/1ns에서 10ns/1ns로 변경되었다는 것입니다. 따라서 시간 단위는 10ns이고 정밀도는 1ns입니다.
// Declare the timescale where time_unit is 10ns
// and time_precision is 1ns
`timescale 10ns/1ns
// NOTE: Testbench is the same as in previous example
module tb;
// To understand the effect of timescale, let us
// drive a signal with some values after some delay
reg val;
initial begin
// Initialize the signal to 0 at time 0 units
val <= 0;
// Advance by 1 time unit, display a message and toggle val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Advance by 0.49 time unit and toggle val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Advance by 0.50 time unit and toggle val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Advance by 0.51 time unit and toggle val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Let simulation run for another 5 time units and exit
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
실제 시뮬레이션 시간은 #
을 사용하여 지정된 지연을 곱하여 얻습니다. 시간 단위로 표시한 다음 정밀도에 따라 반올림됩니다. 첫 번째 지연 문은 10ns를 생성하고 두 번째 지연 문은 14.9를 제공하며 반올림되어 15ns가 됩니다.
세 번째 문장도 마찬가지로 5ns(0.5 * 10ns)를 더하면 총 시간은 20ns가 됩니다. 네 번째는 5ns(0.51 * 10)를 추가하여 총 시간을 25ns로 늘립니다.
시뮬레이션 로그ncsim> run T=10 At time #1 T=15 At time #0.49 T=20 At time #0.50 T=25 At time #0.51 T=75 End of simulation ncsim: *W,RNQUIE: Simulation is complete.
파형의 기본 단위는 1ns의 정밀도로 수십 나노초 단위입니다.
<노스크립트>만 이전 예제와 비교하여 이 예제에서 변경된 사항은 타임스케일이 1ns/1ns에서 1ns/1ps로 변경되었다는 것입니다. 따라서 시간 단위는 1ns이고 정밀도는 1ps입니다.
// Declare the timescale where time_unit is 1ns
// and time_precision is 1ps
`timescale 1ns/1ps
// NOTE: Testbench is the same as in previous example
module tb;
// To understand the effect of timescale, let us
// drive a signal with some values after some delay
reg val;
initial begin
// Initialize the signal to 0 at time 0 units
val <= 0;
// Advance by 1 time unit, display a message and toggle val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Advance by 0.49 time unit and toggle val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Advance by 0.50 time unit and toggle val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Advance by 0.51 time unit and toggle val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Let simulation run for another 5 time units and exit
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
1ps의 새로운 정밀도 값과 일치하도록 조정된 시간 단위를 확인하십시오. 또한 시간은 이 경우 피코초인 가장 작은 해상도로 표시됩니다.
시뮬레이션 로그ncsim> run T=1000 At time #1 T=1490 At time #0.49 T=1990 At time #0.50 T=2500 At time #0.51 T=7500 End of simulation ncsim: *W,RNQUIE: Simulation is complete.<노스크립트>
verilog
매개변수는 다른 사양으로 모듈을 재사용할 수 있도록 하는 Verilog 구성입니다. 예를 들어, 4비트 가산기는 비트 수에 대한 값을 허용하도록 매개변수화될 수 있으며 모듈 인스턴스화 중에 새 매개변수 값이 전달될 수 있습니다. 따라서 N비트 가산기는 4비트, 8비트 또는 16비트 가산기가 될 수 있습니다. 함수 호출 중에 전달되는 함수에 대한 인수와 같습니다. parameter MSB = 7; // MSB is a parameter with a constant value 7 paramet
Verilog는 하드웨어 설명 언어이며 설계자가 RTL 설계를 시뮬레이션하여 논리 게이트로 변환할 필요가 없습니다. 시뮬레이션이 필요한 이유는 무엇입니까? 시뮬레이션은 RTL 코드가 의도한 대로 동작하는지 확인하기 위해 다른 시간에 다른 입력 자극을 설계에 적용하는 기술입니다. 기본적으로 시뮬레이션은 설계의 견고성을 검증하기 위해 잘 따라야 하는 기술입니다. 또한 가공된 칩이 실제 세계에서 사용되는 방식과 다양한 입력에 반응하는 방식과 유사합니다. 예를 들어, 위의 디자인은 출력 pe 보여진 바와 같이. 시뮬레이션을 통해