mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 09:10:10 +00:00
Обновление указания по использованию присваиваний
Ранее давалось более простое правило: "Используй неблокирующее присваивание во всех блоках always", которое конфликтует с правилами, описанными в документе по присваиваниям. Правила были обновлены, таким образом, чтобы сохранить простоту и устранить конфликт.
This commit is contained in:
@@ -71,7 +71,10 @@ assign Y = S==1 ? D1 : D0;
|
||||
|
||||
Мультиплексор можно описать в любом из этих блоков, разница будет лишь в том, к чему именно будет подключен выход мультиплексора: к проводу, регистру, или защелке.
|
||||
|
||||
При присваивании внутри блоков `always` используйте специальный оператор **неблокирующего присваивания** `<=`. Бывает еще оператор **блокирующего присваивания** `=`, объяснение различий в этих операторах требует отдельного документа, поэтому на текущий момент, во избежание проблем в будущем просто запомните: **внутри любого блока always необходимо использовать только оператор неблокирующего присваивания <=**. Подробно о различиях между блокирующими и неблокирующими присваиваниями рассказано в [этом документе](Assignments.md).
|
||||
При присваивании внутри блоков `always` используйте специальный оператор **неблокирующего присваивания** `<=`. Бывает еще оператор **блокирующего присваивания** `=`. Подробно о различиях этих операторов рассказано в [этом документе](Assignments.md). До его прочтения запомните:
|
||||
|
||||
- внутри блока `always_ff` необходимо использовать оператор неблокирующего присваивания (`<=`);
|
||||
- внутри блока `always_comb` необходимо использовать оператор блокирующего присваивания (`=`).
|
||||
|
||||
```SystemVerilog
|
||||
logic Y;
|
||||
|
@@ -216,26 +216,26 @@ module tequila (
|
||||
);
|
||||
parameter logic [3:0] PICKLE = 4'b1100;
|
||||
always_comb begin
|
||||
a <= 1'b0; // значения по-умолчанию
|
||||
b <= 1'b0;
|
||||
c <= 1'b1;
|
||||
d <= 1'b0;
|
||||
a = 1'b0; // значения по-умолчанию
|
||||
b = 1'b0; // обратите внимание, что в блоке
|
||||
c = 1'b1; // always_comb используется оператор
|
||||
d = 1'b0; // блокирующего присваивания
|
||||
case(cucumber)
|
||||
// ... какие-то еще комбинации
|
||||
PICKLE: begin // если на cucumber значение PICKLE
|
||||
c <= 1'b0;
|
||||
case (size)
|
||||
1'b0: b <= 1'b1; // если на size значение 1'b0
|
||||
1'b1: d <= 1'b1; // если на size значение 1'b1
|
||||
endcase
|
||||
end
|
||||
// ... какие-то еще обработчики
|
||||
default: begin // так как описаны не все значения
|
||||
a <= 1'b0; // cucumber, то чтобы case не было
|
||||
b <= 1'b0; // защелки (latch) на выходе
|
||||
c <= 1'b1; // нужно обязательно добавлять
|
||||
d <= 1'b0; // default
|
||||
end
|
||||
// ... какие-то еще комбинации
|
||||
PICKLE: begin // если на cucumber значение PICKLE
|
||||
c = 1'b0;
|
||||
case (size)
|
||||
1'b0: b = 1'b1; // если на size значение 1'b0
|
||||
1'b1: d = 1'b1; // если на size значение 1'b1
|
||||
endcase
|
||||
end
|
||||
// ... какие-то еще обработчики
|
||||
default: begin // так как описаны не все значения
|
||||
a = 1'b0; // cucumber, то чтобы case не было
|
||||
b = 1'b0; // защелки (latch) на выходе
|
||||
c = 1'b1; // нужно обязательно добавлять
|
||||
d = 1'b0; // default
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
|
@@ -85,7 +85,7 @@ module turnstile_fsm(
|
||||
|
||||
assign is_locked = state;
|
||||
|
||||
always @(posedge clk) begin
|
||||
always_ff @(posedge clk) begin
|
||||
if(rst) begin
|
||||
state <= LOCKED;
|
||||
end
|
||||
@@ -128,7 +128,7 @@ module turnstile_fsm(
|
||||
// (!push) && coin — условие перехода в состояние UNLOCKED
|
||||
assign green_light = (state == LOCKED) && (!push) && coin;
|
||||
|
||||
always @(posedge clk) begin
|
||||
always_ff @(posedge clk) begin
|
||||
if(rst) begin
|
||||
state <= LOCKED;
|
||||
end
|
||||
@@ -175,13 +175,13 @@ module turnstile_fsm(
|
||||
|
||||
always_comb begin
|
||||
if(push) begin
|
||||
next_state <= LOCKED;
|
||||
next_state = LOCKED;
|
||||
end
|
||||
else if (coin) begin
|
||||
next_state <= UNLOCKED;
|
||||
next_state = UNLOCKED;
|
||||
end
|
||||
else begin
|
||||
next_state <= state;
|
||||
next_state = state;
|
||||
end
|
||||
end
|
||||
```
|
||||
|
Reference in New Issue
Block a user