Скаляр Verilog и вектор
Verilog должен представлять как отдельные биты, так и группы битов. Например, однобитовый последовательный элемент представляет собой триггер. Однако 16-битный последовательный элемент представляет собой регистр, который может содержать 16 бит. Для этого в Verilog есть скаляр и вектор сети и переменные.
Скаляр и вектор
Сеть или reg
объявление без указания диапазона считается 1-битным и является скаляром. . Если указан диапазон, то сеть или reg
становится многобитным объектом, известным как вектор .
wire o_nor; // single bit scalar net
wire [7:0] o_flop; // 8-bit vector net
reg parity; // single bit scalar variable
reg [31:0] addr; // 32 bit vector variable to store address
Диапазон дает возможность адресовать отдельные биты в векторе. Старший бит вектора должен быть указан как левое значение в диапазоне, а младший бит вектора должен быть указан справа.
wire [msb:lsb] name;
integer my_msb;
wire [15:0] priority; // msb = 15, lsb = 0
wire [my_msb: 2] prior; // illegal
В приведенном выше примере будет создана 16-битная сеть, называемая приоритетом. Обратите внимание, что msb и младший бит должно быть постоянным выражением и не может быть заменено переменной. Но они могут быть любыми целочисленными значениями — положительными, отрицательными или нулевыми; и маленький бит значение может быть больше, равно или меньше значения старшего разряда.
Выбор битов
Любой бит в векторной переменной можно выбрать отдельно и присвоить ему новое значение, как показано ниже. Это называется bit-select . Если бит-выбор выходит за пределы или бит-выбор равен x или з , то возвращаемое значение будет x .
reg [7:0] addr; // 8-bit reg variable [7, 6, 5, 4, 3, 2, 1, 0]
addr [0] = 1; // assign 1 to bit 0 of addr
addr [3] = 0; // assign 0 to bit 3 of addr
addr [8] = 1; // illegal : bit8 does not exist in addr
Выбор части
Можно выбрать диапазон смежных битов, известный как part-select. . Существует два типа выбора частей:один с постоянным выбором частей, а другой с индексированным выбором частей.
reg [31:0] addr;
addr [23:16] = 8'h23; // bits 23 to 16 will be replaced by the new value 'h23 -> constant part-select
Наличие переменной выбора части позволяет эффективно использовать ее в циклах для выбора частей вектора. Хотя начальный бит можно изменить, ширина должна быть постоянной.
[<start_bit> +: <width>] // part-select increments from start-bit [<start_bit> -: <width>] // part-select decrements from start-bit
module des;
reg [31:0] data;
int i;
initial begin
data = 32'hFACE_CAFE;
for (i = 0; i < 4; i++) begin
$display ("data[8*%0d +: 8] = 0x%0h", i, data[8*i +: 8]);
end
$display ("data[7:0] = 0x%0h", data[7:0]);
$display ("data[15:8] = 0x%0h", data[15:8]);
$display ("data[23:16] = 0x%0h", data[23:16]);
$display ("data[31:24] = 0x%0h", data[31:24]);
end
endmodule
Журнал моделирования ncsim> run data[8*0 +: 8] = 0xfe // ~ data [8*0+8 : 8*0] data[8*1 +: 8] = 0xca // ~ data [8*1+8 : 8*1] data[8*2 +: 8] = 0xce // ~ data [8*2+8 : 8*2] data[8*3 +: 8] = 0xfa // ~ data [8*3+8 : 8*3] data[7:0] = 0xfe data[15:8] = 0xca data[23:16] = 0xce data[31:24] = 0xfa ncsim: *W,RNQUIE: Simulation is complete.
Распространенные ошибки
module tb;
reg [15:0] data;
initial begin
$display ("data[0:9] = 0x%0h", data[0:9]); // Error : Reversed part-select index expression ordering
end
endmodule
Verilog