Какова цель слова "begin: u" после l oop? - PullRequest
0 голосов
/ 09 апреля 2020

Вот пример, где после l oop.

for(i=0; i<8; i=i+1) begin: u
    xem7001_led[i] = (a[i]==1'b1) ? (1'b0) : (1'bz);
end

стоит «begin: u» * Что это означает?

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вы можете дать имя блоку begin..en. В данном случае «u» - это имя.

Большинству begin..end блоков не нужно имя.

Это зависит от компилятора / инструмента синтеза, если имя требуется в определенных местах.

например, для некоторых компиляторов вы ДОЛЖНЫ называть блоки для generate:

genvar i;
for (i=0; i<8; i=i+1)
begin : myID
   mygate the_gate(.I0(A[i]),.I1(B[i]),.O(C[i]));
end

Имя затем используется для уникальной идентификации частей в блоке. В приведенном выше примере компилятор часто создает имя наподобие myID[0].the_gate(...);
. В других компиляторах это необязательно, и если вам не нужно указывать имя, компилятор затем создает имя для унификации раздела.


Как указал dave_59:
Есть случаи, когда это не является обязательным. У вас должна быть метка, если вы хотите сослаться на объявление внутри блока снаружи блока

0 голосов
/ 09 апреля 2020
Блок

A begin/end создает область. Без метки область действия становится анонимной, и вы не можете ссылаться на что-либо внутри блока снаружи блока. Добавление метки также облегчает отладку. Вы также можете добавить метку end : u, которая облегчит чтение глубоко вложенных блоков begin/end.

Когда используется генерируемый для l oop, номер индекса индекса добавляется к имени блока.

genvar i;
for (i=0; i<2; i=i+1)
begin : U
   reg a = i;
end : U

Это расширяется, как если бы вы могли написать

reg U[0].a = 0;
reg U[1].a = 1;
...