Что означает приведенный ниже код Verilog localparam
X
? Насколько я понимаю, это так:
if(y==4) X = +64; иначе если(Y==3) X = +32; иначе если(Y==2) X = +16; иначе если(Y==1) X = +8; иначе если(Y==0) X = +4; иначе Х = +2;
Верно ли это? Если да, то еще одна вещь, которая для меня не имеет смысла, — это знак «+» после знака «=», например, (X = +2)? Это что-то уникальное для 9?0005 локальные параметры переменных?
локальный параметр X = (Y==4) ? +64 : (Д==3) ? +32 : (Д==2) ? +16 : (Д==1) ? +8 : (Д==0) ? +4 : +2 ;
Да, оператор localparam
логически эквивалентен оператору if/else
псевдокод, который вы показали.
if/else
. Знаки +
в коде не нужны. Код ведет себя так же, как если бы их не было. Возможно, кто-то скопировал и вставил более сложный код (с такими выражениями, как A+2
) и забыл упростить его. Более простой способ записи:
localparam X = (Y==4) ? 64 : (Д==3) ? 32 : (Д==2) ? 16: (Д==1) ? 8 : (Д==0) ? 4 : 2;\$\конечная группа\$ \$\начало группы\$
Условный оператор ?:
— это выражение, которое ведет себя аналогично if/else
условному процедурному оператору ветвления, как вы заметили. Его можно использовать там, где нецелесообразно использовать процедурные операторы. Параметр /localparam
должен быть назначен с использованием выражения. Вы можете обернуть if/else
в константную функцию, но условный оператор удобнее. Если вы выполняли присвоение переменной, процедурный 9Оператор 0005 case будет намного понятнее.
Унарный оператор +
не имеет другой цели, кроме симметрии с унарным оператором -
. In может сделать цель кода более понятной, если у вас есть сочетание положительных и отрицательных чисел.
Требуется, но никогда не отображается
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
Изменено 2 года, 3 месяца назад
Просмотрено 1к раз
\$\начало группы\$Я пытаюсь понять, как неблокирующие операторы взаимодействуют с определенными процедурными операторами в Verilog.
Если у меня есть следующий блок кода внутри модуля
input clk; . . . делитель параметра = 12; reg [3:0] clk_counter = 0; . . . всегда @(posedge clk) начинать clk_counter <= clk_counter + 1; если (clk_counter == делитель) clk_counter <= 0; конец
Я понимаю, что языки описания аппаратуры не похожи на процедурные языки, и поэтому было бы неплохо избавиться от привычки думать о них так, как если бы они были таковыми, но я просто пытаюсь осмыслить некоторые из Verilog'овских поведенческие конструкции, облегчающие программирование в нем. С учетом сказанного, вот мой вопрос
Будет ли Verilog оценивать правую часть clk_counter <= clk_counter + 1;
, а затем введите цикл if(clk_counter == делитель)
и используйте старое исходное значение
(т. е. не clk_counter + 1
) для оценки условного оператора?
Изменить: проявляется мое чрезвычайно слабое понимание Verilog. Как было указано, компилятор на самом деле не будет оценивать условное выражение. Я знаю об этом. Задавая свой вопрос, я имел в виду следующее: могу ли я предположить, что Verilog создаст схему, которая будет поведенчески имитировать то, что мы считаем оценкой правой части числа 9?0005 clk_counter <= clk_counter + 1; и использовать старое значение clk_counter (т. е. то, что хранится в триггере) при оценке условного выражения. У меня недостаточно опыта работы с языком, чтобы представить, как может выглядеть эта схема, потому что я все еще работаю в уме над тем, как поведенческие конструкции Verilog взаимодействуют друг с другом.
Да, вы правы. Он будет использовать старое значение при оценке условного выражения. Все операторы оцениваются по порядку, но ни одно из назначений не выполняется до тех пор, пока часы не «тикают». Таким образом, последнее назначение «выиграет», если в один и тот же регистр будет выполнено несколько назначений.
\$\конечная группа\$ \$\начало группы\$Ваши рассуждения верны. Неблокирующие операторы в Verilog работают следующим образом:
Выражения в правой части вычисляются последовательно, но не сразу. Присвоение происходит в конце временного шага. В вашем примере clk_counter + 1
оценивается, но не сразу присваивается clk_counter
. Значение clk_counter
перед входом в блок используется для оценки всех выражений (при условии, что только неблокирующие операторы).
Почему Verilog это делает? Во избежание двусмысленности.
Рассмотрим случай, когда одна и та же переменная обновляется в 2 разных процедурных блоках с использованием присвоений блокировки. Оба блока запускаются одновременно. Какое задание выполняется первым? Это очень важно, потому что выражения, следующие за этим, будут использовать это значение. Вероятно, симулятор должен решить, какое выражение присвоить первым. В случае неблокирующих присваиваний все выражения оцениваются параллельно без какой-либо неоднозначности, поскольку все присваивания происходят в конце временного шага.
Что касается схемы, вы можете представить себе, что clk_counter
и делитель
подаются на компаратор, выход которого будет действовать как сигнал выбора для мультиплексора, который выбирает значение данных для подачи в регистр clk_counter
Гарри,
Как уже говорили другие, clk_counter будет обновляться по переднему фронту тактов.