Поразрядные Операторы (Bitwise Operators )

Ключевые символы:~, &, |, ^, (~^, ^~).

К поразрядным операторам относятся поразрядное отрицание, поразрядные логические И, ИЛИ, исключающее или, исключающее ИЛИ-НЕ. Поразрядные операторы выполняются только над операндами, имеющими одинаковую разрядность. В том случае, если разрядность одного операнда меньше другого, недостающие разряды дополняются нулямиы . Ниже приведен пример использования поразрядных операторов.

module bitTest;

reg [3:0] a, b ,c;

initial begin

a = 4'b1100; b = 4'b0011; c = 4'b0101;

$displayb(~a); // bitwise negation, evaluates to 4'b0011

$displayb(a & c); // bitwise and, evaluates to 4'b0100

$displayb(a | b); // bitwise or, evaluates to 4'b1111

$displayb(b ^ c); // bitwise xor, evaluates to 4'b0110

$displayb(a ~^ c); // bitwise xnor, evaluates to 4'b0110

end

endmodule // bitTest

3.4.15.Операторы приведения (Reduction Operator )

Keysymbols: &, ~&, |, ~|, ^, ~^, ^~.

Операторы приведения – И, ИЛИ, И-НЕ, ИЛИ-НЕ, исключающее или, исключающее ИЛИ-НЕ (два варианта). Они выполняются над многоразрядным операндом пошагово, бит за битом, начиная с двух крайних левых разрядов, выдавая на выходе одноразрядный результат. Очевидно, что такой подход позволяет реализовать проверку на четность (нечетность). Ниже приведены примеры использования операторов приведения.

module reductTest;

reg [3:0] a, b ,c;

initial begin

a = 4'b1111;

b = 4'b0101;

c = 4'b0011;

$displayb(& a);//, (то же 1&1&1&1), равен 1 1

$displayb(| b); // (same as 0|1|0|1), evaluates to 1 $displayb(^ b); // искл.ИЛИ (same as 0^1^0^1), evaluates to 0

end

endmodule // reductTest

Безусловно, следует улавливать различия между логическими операторами, поразрядными операторами и операторами приведения. Несмотря на схожесть символов этих операторов, число операндов в каждом случае различно.

Операторы сдвига (Shift Operator).

Ключевые символы: >>, <<.

Операторы сдвига позволяют осуществить сдвиг операнда как вправо, так и влево. Пример их использования приведен ниже

module shiftTest;

reg [3:0] a;

initial begin

a = 4'b1010;

$displayb(a << 1); // shift left by 1, evaluates to 4'b0100

$displayb(a >> 2); // shift right by 2, evaluates to 4'b0010

end

endmodule // shiftTest

Этот оператор часто применяют для реализации регистров сдвига, длинных алгоритмов перемножения и т.п.

Конкатенация (объединение,Concatenation )

Ключевой символ: {, }

Объединение позволяет увеличить разрядность (size) цепей (nets), регистров (registers) и т.д.

module concatTest;

reg a;

reg [1:0] b;

reg [5:0] c;

initial begin

a = 1'b1;

b = 2'b00;

c = 6'b101001;

$displayb({a, b}); // produces a 3-bit number 3'b100

$displayb({c[5:3], a}); // produces 4-bit number 4'b1011

end

endmodule // concatTest

Повторение (Replication )

Повторение (Replication) может быть использовано для многократного повторения объединения (concatenation), как показано в нижеследующем примере.

module replicTest;

reg a;

reg [1:0] b;

reg [5:0] c;

initial begin

a = 1'b1;

b = 2'b00;

$displayb({4{a}}); // результат - 1111

c = {4{a}};

$displayb(c); // результат -001111

end

endmodule // replicTest

Системные директивы (System Tasks )

Наверное, этот раздел не будет интересен тем, кто пишет только синтезируемые описания на Verilog. Но поскольку язык является не только средством описания проекта, но и довольно мощным инструментом для поведенческого моделирования систем, то следует сказать несколько слов о встроенных директивах компилятора, позволяющих выполнить моделирование и произвести анализ его результатов.

Директивы вывода результатов моделирования (Writing to Standard Output)

Ключевые слова: $display, $displayb, $displayh, $displayo, $write, $writeb, $writeh, $writeo.

Наиболее часто применяется директива $display. Она может быть использована для вывода на экран строк, выражений или переменных. Ниже приведен пример использования директивы $display

$display("Hello Dr Blair");

--- output: Hello Dr Blair

$display($time) // current simulation time.

--- output: 460

counter = 4'b10;

$display(" The count is %b", counter);

--- output: The count is 0010

Синтакс определения формата вывода аналогичен синтаксису printf в языке программирования C. Ниже приведено его описание для директивы $display

Формат Описание
%d or %D %b or %B %h or %H %o or %O %m or %M %t or %T %e or %E %f or %F %g or %G Decimal Binary Hexadecimal Octal Hierarchical name Time format Real in scientific format Real in decimal formal Real in shorter of above two

Для специальных символов используются следующие эскейп-последовательности (escape sequence)

\n \t \\ \" %% Новая строка табуляция \ " %

Директива $write идентична директиве $display, за исключением того, что она не осуществляет автоматический переход на новую строку в конце вывода информации

Если спецификация вывода не определена, то по умолчанию исполшьзуются следующие форматы

Директива Формат по умолчанию
$display $displayb $displayh $displayo $write $writeb $writeh $writeo decimal binary hexadecimal octal decimal binary hexadecimal octal

Так, например, следующий фрагмент кода …

$write(5'b01101);

$writeb(" ", 5'b01101);

$writeh(" ", 5'b01101);

$writeo(" ", 5'b01101,"\n");

… И результат его работы

13 01101 0d 15

Наши рекомендации