05.07.2017 C+SystemVerilog

Материал из SRNS
Перейти к: навигация, поиск

Содержание

Общее

Для того, чтобы использовать язык С в верификации FPGA проектов на этапе синтеза - можно использовать DPI-включения. Они позволяют импортировать функции на языке С в verilog и из verilog в С.

Это удобно для обработки процессорных обращений в аппаратные verilog-модули.

Настройка QuestaSim

  • Скачиваем и устанавливаем с сервера questasim-win64-10.4a.rar
  • Скачиваем и разархивируем в корневую папку QuestaSim компилятор questasim-gcc-4.5.0-mingw64.rar

Hello World

Создаем простейшую функцию на С и сохраняем в hello.c

#include <stdio.h>
#include "svdpi.h"

void hello(char* str) {
  printf ("%s\n", str) ;
}

В интересующем нас verilog-модуле подлючаем созданную функцию:

// Declare the DPI import function
import "DPI-C" function void hello(string str);

initial begin
  hello("Hello SystemVerilog") ;
end

Компилируем и запускаем тест:

vlog -quiet -reportprogress 300 -work work_lib verilog_tb.sv hello.c
vsim -novopt work_lib.verilog_tb
run 1000 ns

Видим результат в консоли QuestaSim

Моделируем процессор

Для имитации процессора при верификации проекта берем модуль cpu_sim. На выходе процессора шина AXI3 (как в ZYNQ). Пример включения модуля:

axi3_interface  axi3();

cpu_sim cpu_sim_inst(
    .aclk   (aclk),
    .resetn (resetn),
    .axi3   (axi3)
);

Клоки и ресет необходимо завести в модуль извне

Шину AXI3 в стандартную шину internal_bus превращаем модулем axi3_to_inter:

intbus_interf int_bus();

axi3_to_inter#(
    .BASEADDR (BASEADDR/4)
) axi3_to_inter_inst(
    .axi3    (axi3),
    .int_bus (int_bus)
);

где BASEADDR - это базовый адрес шины процессора в байтах

И процессор и интерфесы поддерживают BURST до 16 транзакций.

Далее пишем программу на "С", пример:

#include <stdio.h>
#include "svdpi.h"

#define BASE_ADDR 0x40120000

extern void readReg (int base, int offset, int burst_len, int *rdata, int *stime);
extern void writeReg (int base, int offset, int burst_len, int *val, int *stime);



int facq();

int cpu_sim() {
    int rdata[16];
    int stime;
    int val[16];
    int i;
   
   
    readReg (BASE_ADDR, 0, 15, &rdata, &stime);
    for(i = 0; i < 16; i ++){
        printf ("%8d 0x%08X : rdata[%d] = 0x%08X\n",stime, BASE_ADDR+0, i, rdata[i]);
    }
   
    for(i = 0; i < 16; i ++){
        val[i] = 0xAABB0000 + i;
    }
    writeReg (BASE_ADDR, 0, 15, val, &stime);

   
    return 0;
}

Файл svdpi.h уже есть в QuestaSim, свои файлы необходимо скопировать в папку с исходным кодом

Функции чтения и записи поддреживают BURST до 16. Длину BURST необходимо указывать как "{ЖЕЛАЕМАЯ_ДЛИНА}-1". Т.е. 0 - это одиночное чтение/запись, 15 - максимальный BURST в 16 транзакций

Пример, как скопировать в tcl:

file copy -force ../sub/interfaces/matlab/ID_DB.h ../sub/acquisition/tb_sv/

Компилируем и запускаем, как было описано выше

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.

Персональные инструменты
Пространства имён

Варианты
Действия
SRNS Wiki
Рабочие журналы
Приватный файлсервер
QNAP Сервер
Инструменты
Печать/экспорт