Верилог Задания
Размещение значений в сетях и переменных называется присвоением. Существует три основных формы:
- Процедурный
- Непрерывно
- Процедурный непрерывный
Допустимые значения LHS
Присваивание состоит из двух частей:правой (правой) и левой (левой) частей с символом равенства (=) или символом меньшего равенства (<=) между ними.
Тип назначения | Левая сторона |
---|---|
Процедурный |
|
Непрерывный |
|
Процедурный Непрерывный |
|
Правая часть может содержать любое выражение, результатом которого является окончательное значение, в то время как левая часть указывает цепь или переменную, которой присваивается значение в правой части.
module tb;
reg clk;
wire a, b, c, d, e, f;
reg z, y;
// clk is on the LHS and the not of clk forms RHS
always #10 clk = ~clk;
// y is the LHS and the constant 1 is RHS
assign y = 1;
// f is the LHS, and the expression of a,b,d,e forms the RHS
assign f = (a | b) ^ (d & e);
always @ (posedge clk) begin
// z is the LHS, and the expression of a,b,c,d forms the RHS
z <= a + b + c + d;
end
initial begin
// Variable names on the left form LHS while 0 is RHS
a <= 0; b <= 0; c <= 0; d <= 0; e <= 0;
clk <= 0;
end
endmodule
Процедурное назначение
Процедурные присваивания происходят внутри таких процедур, как всегда, начальные, задачи и функции, и используются для помещения значений в переменные. Переменная будет хранить значение до следующего присвоения той же переменной.
Значение будет помещено в переменную, когда симуляция выполнит этот оператор в какой-то момент во время симуляции. Это можно контролировать и модифицировать так, как мы хотим, используя операторы потока управления, такие как if-else-if, оператор case и механизмы циклов.
reg [7:0] data;
integer count;
real period;
initial begin
data = 8'h3e;
period = 4.23;
count = 0;
end
always @ (posedge clk)
count++;
Назначение объявления переменной
Начальное значение может быть помещено в переменную во время ее объявления, как показано далее. Присваивание не имеет длительности и сохраняет значение до тех пор, пока не произойдет следующее присвоение той же переменной. Обратите внимание, что присвоение объявлений переменных массиву не разрешено.
module my_block;
reg [31:0] data = 32'hdead_cafe;
initial begin
#20 data = 32'h1234_5678; // data will have dead_cafe from time 0 to time 20
// At time 20, data will get 12345678
end
endmodule
reg [3:0] a = 4'b4;
// is equivalent to
reg [3:0] a;
initial a = 4'b4;
Если переменная инициализируется во время объявления и в момент времени 0 в начальном блоке, как показано ниже, порядок вычисления не гарантируется и, следовательно, может иметь либо 8'h05, либо 8'hee.
module my_block;
reg [7:0] addr = 8'h05;
initial
addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // illegal
integer i = 0, j; // declares two integers i,j and i is assigned 0
real r2 = 4.5, r3 = 8; // declares two real numbers r2,r3 and are assigned 4.5, 8 resp.
time startTime = 40; // declares time variable with initial value 40
Процедурные блоки и назначения будут более подробно описаны в следующем разделе.
Непрерывное назначение
Щелкните здесь, чтобы просмотреть пример пошагового моделирования!
Это используется для присвоения значений скалярным и векторным сетям и происходит всякий раз, когда происходит изменение RHS. Он дает возможность моделировать комбинационную логику без указания взаимосвязи вентилей и упрощает управление сетью с помощью логических выражений.
// Example model of an AND gate
wire a, b, c;
assign a = b & c;
Всякий раз, когда b или c меняют свое значение, будет оцениваться все выражение в RHS и a будет обновлено с новым значением.
Назначение сетевого объявления
Это позволяет нам поместить непрерывное присваивание в тот же оператор, который объявляет сеть. Обратите внимание, что, поскольку цепь может быть объявлена только один раз, для цепи возможно только одно назначение объявления.
wire penable = 1;
Процедурное непрерывное назначение
Это процедурные операторы, которые позволяют непрерывно назначать выражения цепям или переменным и бывают двух типов.
assign
...deassign
force
...release
назначить отменить
Это переопределит все процедурные назначения переменной и деактивируется с помощью того же сигнала с deassign
. Значение переменной останется прежним, пока переменная не получит новое значение посредством процедурного или процедурного непрерывного присвоения. Левая сторона assign
оператор не может быть битовым выбором, частичным выбором или ссылкой на массив, но может быть переменной или конкатенацией переменных.
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
принудительно удалить
Они аналогичны assign - deassign
операторов, но также может применяться к сетям и переменным. LHS может быть выбором бита цепи, выбором части цепи, переменной или цепью, но не может быть ссылкой на массив и выбором бита/части переменной. force
statment переопределит все другие назначения, сделанные для переменной, пока она не будет освобождена с помощью release
ключевое слово.
reg o, a, b;
initial begin
force o = a & b;
...
release o;
end
Verilog