Поразрядные Операторы (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