我无法理解Stuart Sutherland(和他的同事)在SystemVerilog For Design中的示例 10-3。
见第 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
and的阻塞分配RoundRobin
。我在某处读到变量是在本地评估的,但我无法用门来描述逻辑是如何合成的。是否RoundRobin
被合成到状态寄存器?
大多数指南都声明永远不要混合阻塞和非阻塞分配。有没有更好的方法来表示这样的事情?考虑到它在一个always_ff
块中,现在在 SystemVerilog 设计中可以混合两种类型的分配吗?