verilog
네트와 변수에 값을 배치하는 것을 할당이라고 합니다. 세 가지 기본 형식이 있습니다.
할당에는 두 부분이 있습니다. 오른쪽(RHS)과 왼쪽(LHS) 사이에 등호(=) 또는 보다 작음 기호(<=)가 있습니다.
과제 유형 | 왼쪽 |
---|---|
절차적 |
|
연속 |
|
절차적 연속 |
|
RHS는 최종 값으로 평가되는 모든 표현식을 포함할 수 있으며 LHS는 RHS의 값이 할당되는 네트 또는 변수를 나타냅니다.
module tb;
reg clk;
wire a, b, c, d, e, f;
reg z, y;
// clk is on the LHS and the not of clk forms RHS
always #10 clk = ~clk;
// y is the LHS and the constant 1 is RHS
assign y = 1;
// f is the LHS, and the expression of a,b,d,e forms the RHS
assign f = (a | b) ^ (d & e);
always @ (posedge clk) begin
// z is the LHS, and the expression of a,b,c,d forms the RHS
z <= a + b + c + d;
end
initial begin
// Variable names on the left form LHS while 0 is RHS
a <= 0; b <= 0; c <= 0; d <= 0; e <= 0;
clk <= 0;
end
endmodule
절차 할당은 항상, 초기, 작업 및 함수와 같은 절차 내에서 발생하며 변수에 값을 배치하는 데 사용됩니다. 변수는 동일한 변수에 대한 다음 할당까지 값을 유지합니다.
시뮬레이션이 시뮬레이션 시간 중 특정 시점에서 이 명령문을 실행할 때 값이 변수에 배치됩니다. 이것은 if-else-if, case 문 및 반복 메커니즘과 같은 제어 흐름 문을 사용하여 원하는 방식으로 제어 및 수정할 수 있습니다.
reg [7:0] data;
integer count;
real period;
initial begin
data = 8'h3e;
period = 4.23;
count = 0;
end
always @ (posedge clk)
count++;
초기 값은 다음과 같이 선언 시 변수에 배치할 수 있습니다. 할당에는 기간이 없으며 동일한 변수에 대한 다음 할당이 발생할 때까지 값을 유지합니다. 배열에 대한 변수 선언 할당은 허용되지 않습니다.
module my_block;
reg [31:0] data = 32'hdead_cafe;
initial begin
#20 data = 32'h1234_5678; // data will have dead_cafe from time 0 to time 20
// At time 20, data will get 12345678
end
endmodule
reg [3:0] a = 4'b4;
// is equivalent to
reg [3:0] a;
initial a = 4'b4;
아래와 같이 초기 블록에서 선언 시 변수가 초기화되고 초기 블록에서 시간 0인 경우 평가 순서가 보장되지 않으므로 8'h05 또는 8'hee를 가질 수 있습니다.
module my_block;
reg [7:0] addr = 8'h05;
initial
addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // illegal
integer i = 0, j; // declares two integers i,j and i is assigned 0
real r2 = 4.5, r3 = 8; // declares two real numbers r2,r3 and are assigned 4.5, 8 resp.
time startTime = 40; // declares time variable with initial value 40
절차적 블록 및 할당은 이후 섹션에서 더 자세히 다룰 것입니다.
단계별 시뮬레이션 예제를 보려면 여기를 클릭하십시오!
이것은 스칼라 및 벡터 네트에 값을 할당하는 데 사용되며 RHS가 변경될 때마다 발생합니다. 게이트 상호 연결을 지정하지 않고 조합 논리를 모델링하는 방법을 제공하고 논리 표현식으로 네트를 쉽게 구동할 수 있습니다.
// Example model of an AND gate
wire a, b, c;
assign a = b & c;
b 또는 c가 값을 변경할 때마다 RHS의 전체 표현식이 평가되고 a 새 값으로 업데이트됩니다.
이를 통해 net을 선언하는 동일한 명령문에 연속 할당을 배치할 수 있습니다. net은 한 번만 선언할 수 있으므로 net에 대해 하나의 선언 할당만 가능합니다.
wire penable = 1;
이는 네트 또는 변수에 표현식을 지속적으로 할당할 수 있도록 하는 절차적 명령문으로 두 가지 유형이 있습니다.
assign
... deassign
force
... release
이것은 변수에 대한 모든 절차적 할당을 무시하고 deassign
과 동일한 신호를 사용하여 비활성화됩니다. . 변수의 값은 절차적 또는 절차적 연속 할당을 통해 변수가 새 값을 얻을 때까지 동일하게 유지됩니다. assign
의 LHS 문은 비트 선택, 부분 선택 또는 배열 참조가 될 수 없지만 변수 또는 변수의 연결일 수 있습니다.
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
이는 assign - deassign
과 유사합니다. 문에 적용할 수 있지만 네트 및 변수에도 적용할 수 있습니다. LHS는 네트의 비트 선택, 네트의 부분 선택, 변수 또는 네트일 수 있지만 배열에 대한 참조 및 변수의 비트/부분 선택은 될 수 없습니다. force
명령문은 release
을 사용하여 해제될 때까지 변수에 대한 다른 모든 할당을 무시합니다. 키워드.
reg o, a, b;
initial begin
force o = a & b;
...
release o;
end
verilog
Verilog는 하드웨어 설명 언어이며 설계자가 RTL 설계를 시뮬레이션하여 논리 게이트로 변환할 필요가 없습니다. 시뮬레이션이 필요한 이유는 무엇입니까? 시뮬레이션은 RTL 코드가 의도한 대로 동작하는지 확인하기 위해 다른 시간에 다른 입력 자극을 설계에 적용하는 기술입니다. 기본적으로 시뮬레이션은 설계의 견고성을 검증하기 위해 잘 따라야 하는 기술입니다. 또한 가공된 칩이 실제 세계에서 사용되는 방식과 다양한 입력에 반응하는 방식과 유사합니다. 예를 들어, 위의 디자인은 출력 pe 보여진 바와 같이. 시뮬레이션을 통해
디자인 module pr_en ( input [7:0] a, input [7:0] b, input [7:0] c, input [7:0] d, input [1:0] sel, output reg [7:0] out); always @ (a or b or c or d or sel) begin if (sel == 2b00) out <= a; else if