19.02.2016 Моделирование verilog
Boldenkov (обсуждение | вклад) (→А теперь всё то же самое - автоматически) |
Boldenkov (обсуждение | вклад) (→Более сложный пример с автоматизацией процессов) |
||
Строка 86: | Строка 86: | ||
Итак, исходники: | Итак, исходники: | ||
− | * тестируемый модуль | + | * тестируемый модуль my_adder.v: |
− | {{Hider|title = | + | {{Hider|title = my_adder.v: |
|content = <source lang="verilog"> | |content = <source lang="verilog"> | ||
`include "params.v" | `include "params.v" | ||
Строка 119: | Строка 119: | ||
|hidden = 1 | |hidden = 1 | ||
}} | }} | ||
+ | * тесбенч test.v: | ||
+ | {{Hider|title = my_adder.v: | ||
+ | |content = <source lang="verilog"> | ||
+ | `timescale 1ns/1ns | ||
+ | module tb(); | ||
+ | reg clk = 1'b0; | ||
+ | reg resetn; | ||
+ | |||
+ | initial begin | ||
+ | resetn = 0; | ||
+ | #10 | ||
+ | resetn = 1; | ||
+ | |||
+ | end | ||
+ | |||
+ | always #5 clk=!clk; | ||
+ | |||
+ | reg [4:0] cnt=5'b0; | ||
+ | |||
+ | always @(posedge clk) begin | ||
+ | cnt <= cnt+1; | ||
+ | end | ||
+ | |||
+ | wire [10:0] out; | ||
+ | |||
+ | my_adder adder | ||
+ | ( | ||
+ | .clk (clk), | ||
+ | .resetn (resetn), | ||
+ | .in (cnt), | ||
+ | .sum (out) | ||
+ | ); | ||
+ | |||
+ | integer fd_cnt; | ||
+ | integer fd_sum; | ||
+ | initial begin | ||
+ | fd_cnt = $fopen("cnt.txt", "w"); | ||
+ | fd_sum = $fopen("sum.txt", "w"); | ||
+ | end | ||
+ | |||
+ | always @(posedge clk) begin | ||
+ | if (resetn!=1'b0) begin | ||
+ | $fdisplay(fd_cnt, "%d", cnt); | ||
+ | $fdisplay(fd_sum, "%d", adder.sum); | ||
+ | end | ||
+ | end | ||
+ | |||
+ | |||
+ | endmodule // tb | ||
+ | </source> | ||
+ | |hidden = 1 | ||
+ | }} | ||
+ | * Файл параметров inc/params.v: | ||
+ | {{Hider|title = my_adder.v: | ||
+ | |content = <source lang="verilog"> | ||
+ | `define SUM_LENGTH 11 | ||
+ | </source> | ||
+ | |hidden = 1 | ||
+ | }} | ||
Автоматизация процессов будет осуществляться | Автоматизация процессов будет осуществляться |
Версия 11:30, 4 ноября 2016
Итак, задача состоит в том, чтобы с помощью Modelsim провести моделирование кода Verilog.
Создаём файл, который будем моделировать
module tb();
reg clk = 1'b0;
always #5 clk=!clk;
reg [4:0] cnt=5'b0;
always @(posedge clk) begin
cnt <= cnt+1;
end
endmodule
Первая строка задаёт темп моделирования. Строка "always #5 clk=!clk;" задаёт тактовый сигнал - каждые 5 интервалов времени, указанных в timescale. Остальной код тривиален.
Создаём новую библиотеку. Пусть для примера она называется "tb":
Компилируем файл verilog.
Попутно указываем путь к подключаемым чере "`include" файлам, нажав кнопку "Default options":
Запускаем симуляцию - без оптимизации! (Simulate without optimization)
Добавляем требуемые сигналы в окно отображения Wave
Запускаем симуляцию - выбираем длительность и нажимаем кнопку запуска (справа от поля ввода длительности)
В окне Wave смотрим результаты
А теперь всё то же самое - автоматически
Каждый раз делать всё это надоедает. Поэтому можно сделать всё из командного файла. Создаём файл "do.tcl"
vlog -reportprogress 300 -work tb /tmp/Verilog/test.v
vsim -novopt tb.tb
add wave -position instertpoint \
sim:/tb/clk \
sim:/tb/cnt
run 100ns
Запускаем vsim командой:
В результате выдаются временные диаграммы. Можно в коде тестбенча сделать запись результатов в файл, дать в конце скрипта команду exit, тогда временные диаграммы можно будет не смотреть.
Более сложный пример с автоматизацией процессов
Рассмотрим пример, в котором есть тестируемый модуль my_adder.v, тестбенч test.v и включаемый файл inc/params.v. Будет два режима отладки:
- отладка с просмотром временных диаграмм в modelsim
- обработка данных в Matlab с помощью файла test.m
Итак, исходники:
- тестируемый модуль my_adder.v:
module my_adder(
clk,
resetn,
in,
sum
);
parameter LENGTH=`SUM_LENGTH;
input clk;
input resetn;
input [4:0] in;
output [LENGTH-1:0] sum;
reg [LENGTH-1:0] sum;
always @(posedge clk or negedge resetn) begin
if (resetn == 1'b0) begin
sum <= 10'd0;
end else begin
sum <= sum + in;
end
end
endmodule // my_adder
- тесбенч test.v:
module tb();
reg clk = 1'b0;
reg resetn;
initial begin
resetn = 0;
#10
resetn = 1;
end
always #5 clk=!clk;
reg [4:0] cnt=5'b0;
always @(posedge clk) begin
cnt <= cnt+1;
end
wire [10:0] out;
my_adder adder
(
.clk (clk),
.resetn (resetn),
.in (cnt),
.sum (out)
);
integer fd_cnt;
integer fd_sum;
initial begin
fd_cnt = $fopen("cnt.txt", "w");
fd_sum = $fopen("sum.txt", "w");
end
always @(posedge clk) begin
if (resetn!=1'b0) begin
$fdisplay(fd_cnt, "%d", cnt);
$fdisplay(fd_sum, "%d", adder.sum);
end
end
endmodule // tb
- Файл параметров inc/params.v:
Автоматизация процессов будет осуществляться
[ Хронологический вид ]Комментарии
Войдите, чтобы комментировать.