From 765a0a3f3e976e9bc447ed5942e990a4c3a23637 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Sat, 3 Feb 2024 12:18:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D1=81=D0=B2=D0=B0=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ранее давалось более простое правило: "Используй неблокирующее присваивание во всех блоках always", которое конфликтует с правилами, описанными в документе по присваиваниям. Правила были обновлены, таким образом, чтобы сохранить простоту и устранить конфликт. --- Basic Verilog structures/Multiplexors.md | 5 +++- Labs/05. Main decoder/README.md | 38 ++++++++++++------------ Labs/14. Programming device/README.md | 10 +++---- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/Basic Verilog structures/Multiplexors.md b/Basic Verilog structures/Multiplexors.md index 5efb5fa..49f2337 100644 --- a/Basic Verilog structures/Multiplexors.md +++ b/Basic Verilog structures/Multiplexors.md @@ -71,7 +71,10 @@ assign Y = S==1 ? D1 : D0; Мультиплексор можно описать в любом из этих блоков, разница будет лишь в том, к чему именно будет подключен выход мультиплексора: к проводу, регистру, или защелке. -При присваивании внутри блоков `always` используйте специальный оператор **неблокирующего присваивания** `<=`. Бывает еще оператор **блокирующего присваивания** `=`, объяснение различий в этих операторах требует отдельного документа, поэтому на текущий момент, во избежание проблем в будущем просто запомните: **внутри любого блока always необходимо использовать только оператор неблокирующего присваивания <=**. Подробно о различиях между блокирующими и неблокирующими присваиваниями рассказано в [этом документе](Assignments.md). +При присваивании внутри блоков `always` используйте специальный оператор **неблокирующего присваивания** `<=`. Бывает еще оператор **блокирующего присваивания** `=`. Подробно о различиях этих операторов рассказано в [этом документе](Assignments.md). До его прочтения запомните: + +- внутри блока `always_ff` необходимо использовать оператор неблокирующего присваивания (`<=`); +- внутри блока `always_comb` необходимо использовать оператор блокирующего присваивания (`=`). ```SystemVerilog logic Y; diff --git a/Labs/05. Main decoder/README.md b/Labs/05. Main decoder/README.md index 2aab3e8..300baaf 100644 --- a/Labs/05. Main decoder/README.md +++ b/Labs/05. Main decoder/README.md @@ -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 diff --git a/Labs/14. Programming device/README.md b/Labs/14. Programming device/README.md index 8614e6f..43f527b 100644 --- a/Labs/14. Programming device/README.md +++ b/Labs/14. Programming device/README.md @@ -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 ```