Обновление указания по использованию присваиваний

Ранее давалось более простое правило:

"Используй неблокирующее присваивание во всех блоках always", которое
конфликтует с правилами, описанными в документе по присваиваниям.
Правила были обновлены, таким образом, чтобы сохранить простоту и
устранить конфликт.
This commit is contained in:
Andrei Solodovnikov
2024-02-03 12:18:12 +03:00
parent d215a215b8
commit 765a0a3f3e
3 changed files with 28 additions and 25 deletions

View File

@@ -71,7 +71,10 @@ assign Y = S==1 ? D1 : D0;
Мультиплексор можно описать в любом из этих блоков, разница будет лишь в том, к чему именно будет подключен выход мультиплексора: к проводу, регистру, или защелке. Мультиплексор можно описать в любом из этих блоков, разница будет лишь в том, к чему именно будет подключен выход мультиплексора: к проводу, регистру, или защелке.
При присваивании внутри блоков `always` используйте специальный оператор **неблокирующего присваивания** `<=`. Бывает еще оператор **блокирующего присваивания** `=`, объяснение различий в этих операторах требует отдельного документа, поэтому на текущий момент, во избежание проблем в будущем просто запомните: **внутри любого блока always необходимо использовать только оператор неблокирующего присваивания <=**. Подробно о различиях между блокирующими и неблокирующими присваиваниями рассказано в [этом документе](Assignments.md). При присваивании внутри блоков `always` используйте специальный оператор **неблокирующего присваивания** `<=`. Бывает еще оператор **блокирующего присваивания** `=`. Подробно о различиях этих операторов рассказано в [этом документе](Assignments.md). До его прочтения запомните:
- внутри блока `always_ff` необходимо использовать оператор неблокирующего присваивания (`<=`);
- внутри блока `always_comb` необходимо использовать оператор блокирующего присваивания (`=`).
```SystemVerilog ```SystemVerilog
logic Y; logic Y;

View File

@@ -216,25 +216,25 @@ module tequila (
); );
parameter logic [3:0] PICKLE = 4'b1100; parameter logic [3:0] PICKLE = 4'b1100;
always_comb begin always_comb begin
a <= 1'b0; // значения по-умолчанию a = 1'b0; // значения по-умолчанию
b <= 1'b0; b = 1'b0; // обратите внимание, что в блоке
c <= 1'b1; c = 1'b1; // always_comb используется оператор
d <= 1'b0; d = 1'b0; // блокирующего присваивания
case(cucumber) case(cucumber)
// ... какие-то еще комбинации // ... какие-то еще комбинации
PICKLE: begin // если на cucumber значение PICKLE PICKLE: begin // если на cucumber значение PICKLE
c <= 1'b0; c = 1'b0;
case (size) case (size)
1'b0: b <= 1'b1; // если на size значение 1'b0 1'b0: b = 1'b1; // если на size значение 1'b0
1'b1: d <= 1'b1; // если на size значение 1'b1 1'b1: d = 1'b1; // если на size значение 1'b1
endcase endcase
end end
// ... какие-то еще обработчики // ... какие-то еще обработчики
default: begin // так как описаны не все значения default: begin // так как описаны не все значения
a <= 1'b0; // cucumber, то чтобы case не было a = 1'b0; // cucumber, то чтобы case не было
b <= 1'b0; // защелки (latch) на выходе b = 1'b0; // защелки (latch) на выходе
c <= 1'b1; // нужно обязательно добавлять c = 1'b1; // нужно обязательно добавлять
d <= 1'b0; // default d = 1'b0; // default
end end
endcase endcase
end end

View File

@@ -85,7 +85,7 @@ module turnstile_fsm(
assign is_locked = state; assign is_locked = state;
always @(posedge clk) begin always_ff @(posedge clk) begin
if(rst) begin if(rst) begin
state <= LOCKED; state <= LOCKED;
end end
@@ -128,7 +128,7 @@ module turnstile_fsm(
// (!push) && coin — условие перехода в состояние UNLOCKED // (!push) && coin — условие перехода в состояние UNLOCKED
assign green_light = (state == LOCKED) && (!push) && coin; assign green_light = (state == LOCKED) && (!push) && coin;
always @(posedge clk) begin always_ff @(posedge clk) begin
if(rst) begin if(rst) begin
state <= LOCKED; state <= LOCKED;
end end
@@ -175,13 +175,13 @@ module turnstile_fsm(
always_comb begin always_comb begin
if(push) begin if(push) begin
next_state <= LOCKED; next_state = LOCKED;
end end
else if (coin) begin else if (coin) begin
next_state <= UNLOCKED; next_state = UNLOCKED;
end end
else begin else begin
next_state <= state; next_state = state;
end end
end end
``` ```