Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Так же в SV есть удобство в виде автоматического выравнивания разрядности данных.
Т.е. если в проекте используется тип данных integer но по логике работы понятно что значение данного регистра не превышает 255 (в десятичной системе),
то после компиляции данный регистр будет 8 разрядным.
Таким образом налицо очередная вольность допускаемая стандартом SV — он не требует явного выравнивания длин регистров.
always@(posedge CLK) begin
if (cnt >= 13500000) begin
CLK_OUT <= 1;
end
else begin
CLK_OUT <= 0;
end
if (cnt == 27000000) begin
cnt <= 0;
end
else begin
cnt <= cnt + 1;
end
CNT_OUT <= cnt;
end
always@(posedge CLK) CLK_OUT <= (cnt >= 13500000) ? 1 : 0;
always@(posedge CLK) cnt <= (cnt == 27000000) ? 0 : (cnt + 1);
always@(posedge CLK) CNT_OUT <= cnt;
module test0
(
input logic a,
output logic b
);
test1
test1_instance
(
.*
);
endmodule
module test1
(
input logic in_a,
output logic out_b
);
always_comb
out_b = ~in_a;
endmodule
Error (10897): SystemVerilog error at test0.sv(10): can't implicitly connect port "in_a" on instance "test1_instance" of module "test1" - no such object is visible in the present scope
Error (10897): SystemVerilog error at test0.sv(10): can't implicitly connect port "out_b" on instance "test1_instance" of module "test1" - no such object is visible in the present scopeСравните сами листинг приведенный выше в записи на SystemVerilog:
Так же в SV есть удобство в виде автоматического выравнивания разрядности данных.Не факт и не стандарт. Это оптимизация: remove registers with lost fan-outs. И автоматическое приведение разрядности сродни автоматическому приведению типов — когда хорошо, а когда и великое зло.
Т.е. если в проекте используется тип данных integer но по логике работы понятно что значение данного регистра не превышает 255 (в десятичной системе),
то после компиляции данный регистр будет 8 разрядным.
Таким образом налицо очередная вольность допускаемая стандартом SV — он не требует явного выравнивания длин регистров.
enum bit [0:7]
{
reset,
idle,
s00,
s01
}state, new_state;
module div_by_N
#(
parameter N = 1000
)
(
input logic areset,
input logic clk,
input logic ena,
output logic divided_clk
);
localparam Nm2 = N / 2;
localparam CW = $clog2(Nm2);
typedef logic [CW-1:0] counter_t;
counter_t counter;
logic nextedge;
always_comb
nextedge = (counter == (Nm2 - 1));
always_ff@(posedge areset or posedge clk)
if (areset)
counter <= '0;
else
if (ena)
if (nextedge)
counter <= '0;
else
counter <= counter + 1'b1;
always_ff@(posedge areset or posedge clk)
if (areset)
divided_clk <= '0;
else
if (ena)
if (nextedge)
divided_clk <= ~divided_clk;
endmodule
c = a/b; — квартус синтезирует однотактный делитель, которы иногда делит не верно.
(знаю, что так делать нельзя, и однотактное деление по сути зло)
Коротенькое сравнение VHDL и Verilog в помощь начинающим знакомство с ПЛИС