Я не могу понять пример 10-3 в Книга SystemVerilog For Design Стюарта Сазерленда (и компании).
См. строку 232:
Вот фрагмент кода. Мой вопрос последует.
bit [0:NumRx-1] RoundRobin;
always_ff @(posedge clk, posedge reset) begin: FSM
bit breakVar;
if (reset) begin: reset_logic
Rxready <= '1;
Txvalid <= '0;
Txsel_out <= '0;
SquatState <= wait_rx_valid;
forward <= 0;
RoundRobin = 1;
end: reset_logic
else begin: FSM_sequencer
unique case (SquatState)
wait_rx_valid: begin: rx_valid_state
Rxready <= '1;
breakVar = 1;
for (int j=0; j<NumRx; j+=1) begin: loop1
for (int i=0; i<NumRx; i+=1) begin: loop2
if (Rxvalid[i] && RoundRobin[i] && breakVar)
begin: match
ATMcell <= RxATMcell[i];
Rxready[i] <= 0;
SquatState <= wait_rx_not_valid;
breakVar = 0;
end: match
end: loop2
if (breakVar)
RoundRobin={RoundRobin[1:$bits(RoundRobin)-1],
RoundRobin[0]};
end: loop1
end: rx_valid_state
В частности, мой вопрос касается назначения блокировки для breakVar
и RoundRobin
. Я где-то читал, что переменные оцениваются локально, но я не могу представить в терминах вентилей, как синтезируется логика. Синтезируется ли RoundRobin
в государственный реестр?
В большинстве руководств говорится, что нельзя смешивать блокирующие и неблокирующие назначения. Есть ли лучший способ представить что-то подобное? Можно ли теперь в проектах SystemVerilog смешивать оба типа назначений, учитывая, что они находятся в блоке always_ff
?