сколько триггеров этот код произведет при синтезе? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь понять, сколько переворотов этот код произведет при синтезе?

У меня есть 2 теста с неблокирующим и блокирующим кодом назначения.

Тест 1.

wire aclk; 
wire [1:0] a; 
reg [1:0] c; 
reg [1:0] b;

always @(posedge aclk) 
begin 

 b <= a + 1; 
 c = b; 
end

Тест 2.

wire aclk; 
wire [1:0] a; 
reg [1:0] c; 
reg [1:0] b;

always @(posedge aclk) 
begin 

 b = a + 1; 
 c <= b; 
end

Тест 1 имеет 4 FF, а Тест 2 - 2 FF.

Я не могу понять, как это имеет значение, я просто переключаю код.

Спасибо, что сообщили мне об этом.

1 Ответ

0 голосов
/ 12 января 2019

Они функционально разные. Неблокирующее присваивание оценивает правую часть, а затем переходит к следующему оператору, сохранение в левую часть не выполняется до тех пор, пока все остальные операторы не будут оценены первыми. Операторы блокировки оценивают правую часть и немедленно сохраняют ее в левой части.

Test1 is doing this:
evaluate (a+1)
store b into c , BEFORE (a+1) is stored into b!!!
store (a+1) into b

Test2 is doing this:
evaluate (a+1)
store (a+1) into b
store b into c

Как упоминалось выше, вы обычно используете неблокирующие операторы в последовательной логике. Большинство людей также рекомендуют не смешивать неблокирующие и блокирующие операторы в одном и том же блоке begin-end.

...