Commit 1d721161 authored by Dimitris Lampridis's avatar Dimitris Lampridis Committed by Federico Vaga

*: introduce demo for SPEC card

This includes both HDL, the full software stack and documentation
Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
Signed-off-by: Dimitris Lampridis's avatarDimitris Lampridis <dimitris.lampridis@cern.ch>
parent 590af67c
# Change Log
## [0.0.0] - 2018-06-06
This start the project fmc-spec-carrier from the Mock Turtle template.
It includes basic files for hdl and software development
This is the README file for the fmc-spec-carrier project.
GIT_VERSION = $(shell cd $(src); git describe --dirty --long --tags)
all: doxygen
doxygen:
GIT_VERSION=$(GIT_VERSION) EXCLUDE_FILES=$(EXCLUDE_FILES) BRIEF=$(BRIEF) \
doxygen ./doxygen-spec-config
.PHONY: all doxygen
PROJECT_NAME = "${name}"
PROJECT_NUMBER = $(GIT_VERSION)
PROJECT_BRIEF =
PROJECT_LOGO =
OUTPUT_DIRECTORY = doxygen-${short_name}
CREATE_SUBDIRS = YES
TAB_SIZE = 8
OPTIMIZE_OUTPUT_FOR_C = YES
EXTRACT_STATIC = YES
CASE_SENSE_NAMES = YES
WARN_NO_PARAMDOC = YES
INPUT = ../lib
RECURSIVE = YES
EXCLUDE =
GENERATE_HTML = YES
GENERATE_LATEX = YES
\ No newline at end of file
-include Makefile.specific
# If needed add here images conversion
\ No newline at end of file
APPLICATION_ID = 0xd330d331
RT_APPLICATION_ID_CPU1 = 0x3456789A
RT_APPLICATION_ID_CPU2 = 0xA9876543
*.so
*.a
*.mod.c
*.o
*.ko
*.o.cmd
*~
\#*\#
*TAGS
Module.symvers
modules.order
Makefile.specific
*.S
*.bin
*.elf
*.gdb
GPATH
*.log
*.aux
-include Makefile.specific
DIRS := lib
DIRS += tools
DIRS += firmware
all clean cleanall modules install modules_install: $(DIRS)
clean: TARGET = clean
cleanall: TARGET = cleanall
modules: TARGET = modules
install: TARGET = install
modules_install: TARGET = modules_install
$(DIRS):
$(MAKE) -C $@ $(TARGET)
.PHONY: all clean cleanall modules install modules_install
.PHONY: $(DIRS)
\ No newline at end of file
-include Makefile.specific
DIRS := fw-01 fw-02
all clean cleanall modules install modules_install: $(DIRS)
clean: TARGET = clean
cleanall: TARGET = cleanall
modules: TARGET = modules
install: TARGET = install
modules_install: TARGET = modules_install
DOT-CONFIGS = $(addsuffix /.config,$(DIRS))
$(DIRS): $(DOT-CONFIGS)
$(MAKE) -C $@ $(TARGET)
$(DOT-CONFIGS):
$(MAKE) -C $(@D) defconfig
.PHONY: all clean cleanall modules install modules_install
.PHONY: $(DIRS)
/*
* Copyright (C) 2018 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
#ifndef __FW_SVEC_COMMON_H__
#define __FW_SVEC_COMMON_H__
#include <mockturtle-rt.h>
#include <spec-common.h>
extern volatile struct spec_cfg cfg;
extern volatile int autospec_led_period;
extern volatile int autospec_print_period;
#endif
/*
* Copyright (C) 2018 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
#include "mockturtle-rt.h"
#include "fw-spec-common.h"
SMEM volatile struct spec_cfg cfg;
#ifndef SIMULATION
SMEM volatile int autospec_led_period = 0x1FFFF;
SMEM volatile int autospec_print_period = 0xFFFFF;
#else
SMEM volatile int autospec_led_period = 0x1;
SMEM volatile int autospec_print_period = 0x7;
#endif
mainmenu "fmc-svec-carrier fw-01 demo configuration"
comment "Project specific configuration"
# include Mock Turtle's Kconfig
source "Kconfig.mt"
include ../../../project.mk
OBJS = fw-spec.o
OBJS += common/fw-spec-smem-code.o
OBJDIR += common
OUTPUT = fw-spec-1
TRTL ?= ../../../../../
TRTL_SW = $(TRTL)/software
EXTRA_CFLAGS += -I../../include
EXTRA_CFLAGS += -I../common
EXTRA_CFLAGS += -DFPGA_APPLICATION_ID=APPLICATION_ID
EXTRA_CFLAGS += -DRT_APPLICATION_ID=$(RT_APPLICATION_ID_CPU1)
vpath %.c ../
include $(TRTL_SW)/firmware/Makefile
#
# Automatically generated file; DO NOT EDIT.
# fmc-svec-carrier fw-01 demo configuration
#
#
# Project specific configuration
#
#
# Mock Turtle configuration
#
CONFIG_FPGA_APPLICATION_ID=0
CONFIG_RT_APPLICATION_ID=0
CONFIG_CFLAGS_OPT="-O0"
CONFIG_CFLAGS_EXTRA="-ggdb"
#
# Mock Turtle framework configuration
#
# CONFIG_MOCKTURTLE_FRAMEWORK_ENABLE is not set
CONFIG_MOCKTURTLE_FRAMEWORK_ACTION_ENABLE=y
# CONFIG_MOCKTURTLE_FRAMEWORK_VARIABLE_ENABLE is not set
# CONFIG_MOCKTURTLE_FRAMEWORK_BUFFER_ENABLE is not set
CONFIG_MOCKTURTLE_FRAMEWORK_PING_ENABLE=y
CONFIG_MOCKTURTLE_FRAMEWORK_VERSION_ENABLE=y
#
# Mock Turtle library configuration
#
CONFIG_MOCKTURTLE_LIBRARY_PRINT_ENABLE=y
# CONFIG_MOCKTURTLE_LIBRARY_PRINT_DEBUG_ENABLE is not set
# CONFIG_MOCKTURTLE_LIBRARY_PRINT_ERROR_ENABLE is not set
# CONFIG_MOCKTURTLE_LIBRARY_PRINT_MESSAGE_ENABLE is not set
/*
* Copyright (C) 2018 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
#include <inttypes.h>
#include <string.h>
#include "mockturtle-rt.h"
#include <fw-spec-common.h>
#define GPIO_CODR 0x0
#define GPIO_SODR 0x4
#define GPIO_DDR 0x8
#define GPIO_PSR 0xc
#define PIN_BTN_OFFSET 0
#define PIN_BTN_MASK (0x00000003)
#define PIN_LED0_OFFSET 2
#define PIN_LED0_MASK (0x0000003C)
#define PIN_LED1_OFFSET 6
#define PIN_LED1_MASK (0x000000C0)
#define PIN_LED_OFFSET 2
#define PIN_LED_MASK (PIN_LED0_MASK | PIN_LED1_MASK)
static int gpio_get_state(int pin)
{
/* Remember, the button logic is inverted */
return !(dp_readl(GPIO_PSR) & (1 << pin));
}
static int btn_action(void)
{
int i;
for (i = 0; i < 2; ++i)
if (gpio_get_state(i))
return cfg.btn[i];
return SPEC_BTN_NONE;
}
static void led_mode0(int iteration)
{
dp_writel(PIN_LED0_MASK, iteration & 0x1 ? GPIO_SODR : GPIO_CODR);
}
static void led_mode1(int iteration)
{
dp_writel(PIN_LED1_MASK, iteration & 0x1 ? GPIO_SODR : GPIO_CODR);
}
static void led_mode2(int iteration)
{
led_mode0(iteration);
led_mode1(iteration);
}
static void (*ledmodes[])(int) = {
led_mode0,
led_mode1,
led_mode2,
};
static void autospec()
{
unsigned int i, j = 0, stop;
while (1) {
/* Clear all GPIOs (LEDs) */
dp_writel(PIN_LED_MASK, GPIO_CODR);
for (i = 0, stop = 0; stop == 0; i++) {
/* Run the button action when asked */
switch (btn_action()) {
case SPEC_BTN_RESET:
stop = 1;
case SPEC_BTN_PAUSE:
continue;
default:
/* Update LEDs */
if ((i & autospec_led_period) == 0 &&
cfg.led < __SPEC_LED_MODE_MAX)
ledmodes[cfg.led](j++);
break;
}
if ((i & autospec_print_period) == 0) {
/* This output is not reliable for debugging purpose,
it's just to show that you can do it */
pp_printf("GPIO direction 0x%"PRIx32"\n\rGPIO 0x%"PRIx32"\n\r",
dp_readl(GPIO_DDR),
dp_readl(GPIO_PSR));
}
}
}
}
int main()
{
cfg.led = SPEC_LED_MODE0;
cfg.btn[0] = SPEC_BTN_RESET;
cfg.btn[1] = SPEC_BTN_PAUSE;
#ifndef SIMULATION
smem_atomic_or(&autospec_led_period, 0x1FFFF);
smem_atomic_or(&autospec_print_period, 0xFFFFF);
#else
smem_atomic_or(&autospec_led_period, 0x1);
smem_atomic_or(&autospec_print_period, 0x7);
#endif
/* Print something on the debug interface */
pp_printf("Running LED 'blinker'\n\r");
pp_printf("Update period:\n\r");
pp_printf("\t- LED: 0x%x'\n\r", autospec_led_period);
pp_printf("\t- print: 0x%x'\n\r", autospec_print_period);
autospec();
}
mainmenu "fmc-svec-carrier fw-02 demo configuration"
comment "Project specific configuration"
# include Mock Turtle's Kconfig
source "Kconfig.mt"
include ../../../project.mk
OBJS = fw-spec.o
OBJS += common/fw-spec-smem-code.o
OBJDIR += common
OUTPUT = fw-spec-2
TRTL ?= ../../../../../
TRTL_SW = $(TRTL)/software
EXTRA_CFLAGS += -I../../include
EXTRA_CFLAGS += -I../common
EXTRA_CFLAGS += -DFPGA_APPLICATION_ID=$(APPLICATION_ID)
EXTRA_CFLAGS += -DRT_APPLICATION_ID=$(RT_APPLICATION_ID_CPU2)
EXTRA_CFLAGS += -DLIBRT_DEBUG_VERBOSE -DLIBRT_DEBUG
vpath %.c ../
include $(TRTL_SW)/firmware/Makefile
#
# Automatically generated file; DO NOT EDIT.
# fmc-svec-carrier fw-02 demo configuration
#
#
# Project specific configuration
#
#
# Mock Turtle configuration
#
CONFIG_FPGA_APPLICATION_ID=0
CONFIG_RT_APPLICATION_ID=0
CONFIG_CFLAGS_OPT="-O0"
CONFIG_CFLAGS_EXTRA="-ggdb"
#
# Mock Turtle framework configuration
#
CONFIG_MOCKTURTLE_FRAMEWORK_ENABLE=y
CONFIG_MOCKTURTLE_FRAMEWORK_DEBUG_ENABLE=y
CONFIG_MOCKTURTLE_FRAMEWORK_ACTION_ENABLE=y
# CONFIG_MOCKTURTLE_FRAMEWORK_VARIABLE_ENABLE is not set
CONFIG_MOCKTURTLE_FRAMEWORK_BUFFER_ENABLE=y
CONFIG_MOCKTURTLE_FRAMEWORK_PING_ENABLE=y
CONFIG_MOCKTURTLE_FRAMEWORK_VERSION_ENABLE=y
# CONFIG_MOCKTURTLE_FRAMEWORK_VALUE_SEND_ENABLE is not set
CONFIG_MOCKTURTLE_FRAMEWORK_BUFFER_SEND_ENABLE=y
#
# Mock Turtle library configuration
#
CONFIG_MOCKTURTLE_LIBRARY_PRINT_ENABLE=y
# CONFIG_MOCKTURTLE_LIBRARY_PRINT_DEBUG_ENABLE is not set
# CONFIG_MOCKTURTLE_LIBRARY_PRINT_ERROR_ENABLE is not set
# CONFIG_MOCKTURTLE_LIBRARY_PRINT_MESSAGE_ENABLE is not set
/*
* Copyright (C) 2018 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
#include <string.h>
#include <mockturtle-rt.h>
#include <fw-spec-common.h>
#include <mockturtle-framework.h>
struct trtl_fw_buffer spec_buffers[] = {
[SPEC_BUF_CFG] = {
.buf = &cfg,
.len = sizeof(struct spec_cfg),
}
};
static int spec_init()
{
pp_printf("Booting %s ...\n", app.name);
pp_printf("Booting 0x%x ...\n", &autospec_led_period);
pp_printf("Booting 0x%x ...\n", &autospec_print_period);
return 0;
}
/**
* Well, the main :)
*/
static int spec_main()
{
pp_printf("Running %s ...\n", app.name);
while (1) {
/* Handle all messages incoming from HMQ 0 as actions */
trtl_fw_mq_action_dispatch(TRTL_HMQ, 0);
}
return 0;
}
static int spec_exit()
{
pp_printf("Closing %s ...\n", app.name);
return 0;
}
struct trtl_fw_application app = {
.name = "controller",
.version = {
.rt_id = RT_APPLICATION_ID,
.rt_version = RT_VERSION(1, 0),
.git_version = GIT_VERSION
},
.buffers = spec_buffers,
.n_buffers = ARRAY_SIZE(spec_buffers),
.init = spec_init,
.main = spec_main,
.exit = spec_exit,
};
/*
* Copyright (C) 2015 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*/
#ifndef __SPEC_COMMON_H
#define __SPEC_COMMON_H
#include <mockturtle.h>
/**
* Exported buffers
*/
enum trtl_fw_buffer_index {
SPEC_BUF_CFG = 0,
__SPEC_BUF_MAX,
};
/**
* Known action ID (a.k.a. message ID)
*/
enum rt_action_recv_spec {
SPEC_ID_CFG_SET = 0,
SPEC_ID_CFG_GET,
};
/**
* The possible LED modes
*/
enum spec_led_mode {
SPEC_LED_MODE0 = 0,
SPEC_LED_MODE1,
SPEC_LED_MODE2,
__SPEC_LED_MODE_MAX,
};
/**
* Button mode
*/
enum spec_btn_mode {
SPEC_BTN_NONE = 0,
SPEC_BTN_PAUSE,
SPEC_BTN_RESET,
__SPEC_BTN_MAX,
};
struct spec_cfg {
enum spec_led_mode led;
enum spec_btn_mode btn[2];
};
#endif
# If it exists includes Makefile.specific. In this Makefile, you should put
# specific Makefile code that you want to run before this. For example,
# build a particular environment.
-include Makefile.specific
TRTL ?= ../../../../
TRTL_SW = $(TRTL)/software
# include parent_common.mk for buildsystem's defines
REPO_PARENT ?= $(TRTL)/..
-include $(REPO_PARENT)/parent_common.mk
include ../../project.mk
LIB = libspec.a
LOBJ := libspec.o
CFLAGS += -Wall -ggdb -O2
CFLAGS += -I. -I../include
CFLAGS += -I$(TRTL_SW)/include -I$(TRTL_SW)/lib -I$(TRTL_SW)/kernel
CFLAGS += -DRT_APPLICATION_ID_CPU2=$(RT_APPLICATION_ID_CPU2)
CFLAGS += $(EXTRACFLAGS)
LDFLAGS += -L.
ARFLAGS = rc
LDLIBS += -lspec
modules all: $(LIB)
%: %.c $(LIB) $(LIBRT)
$(CC) $(CFLAGS) $(LDFLAGS) $*.c $(LDLIBS) -o $@
$(LIB): $(LOBJ)
$(AR) $(ARFLAGS) $@ $^
clean:
rm -f $(LIB) .depend *.o *~
cleanall: clean
.depend: Makefile $(wildcard *.c *.h)
$(CC) $(CFLAGS) -M $(LOBJ:.o=.c) -o $@
install modules_install:
-include .depend
/*
* Copyright (C) 2018 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
#ifndef __LIBSPEC_INTERNAL__H__
#define __LIBSPEC_INTERNAL__H__
#include <stdlib.h>
#include <libspec.h>
#define SPEC_CPU_AUTO 0
#define SPEC_CPU_MANUAL 1
#define SPEC_CPU_MANUAL_HMQ 0
/**
* Description of a fmc-spec-carrier device
*/
struct spec_desc {
struct trtl_dev *trtl; /**< WRNC device associated */
uint32_t dev_id; /**< fmc device id */
uint32_t app_id; /**< Application id */
uint32_t n_cpu; /**< Number of CPUs */
};
#endif
/*
* Copyright (C) 2018 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
/*
* This is just a SPEC, the code is not optimized
*/
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <libmockturtle.h>
#include <libspec-internal.h>
const char *spec_btn_str[] = {
"none",
"pause",
"reset",
};
const char *spec_errors[] = {
"Invalid configuration\n",
};
const char *spec_btn_to_name(enum spec_btn_mode mode)
{
return spec_btn_str[mode];
}
/**
* It returns a string messages corresponding to a given error code. If
* it is not a libwrtd error code, it will run trtl_strerror()
* @param[in] err error code
* @return a message error
*/
const char *spec_strerror(unsigned int err)
{
if (err < __ESPEC_MIN_ERROR_NUMBER || err >= __ESPEC_MAX_ERROR_NUMBER)
return trtl_strerror(err);
return spec_errors[err - __ESPEC_MIN_ERROR_NUMBER];
}
/**
* It initializes the SPEC library. It must be called before doing
* anything else.
* This library is based on the libmockturtle, so internally, this function also
* run spec_init() in order to initialize the WRNC library.
* @return 0 on success, otherwise -1 and errno is appropriately set
*/
int spec_init()
{
int err;
err = trtl_init();
if (err)
return err;
return 0;
}
/**
* It releases the resources allocated by spec_init(). It must be called when
* you stop to use this library. Then, you cannot use functions from this
* library.
*/
void spec_exit()
{
trtl_exit();
}
/**
* Open a WRTD node device using ID ID
* @param[in] device_id ID device identificator
* @return It returns an anonymous spec_node structure on success.
* On error, NULL is returned, and errno is set appropriately.
*/
struct spec_node *spec_open_by_id(uint32_t device_id)
{
struct spec_desc *spec;
spec = malloc(sizeof(struct spec_desc));
if (!spec)
return NULL;
spec->trtl = trtl_open_by_id(device_id);
if (!spec->trtl)
goto out;
spec->dev_id = device_id;
return (struct spec_node *)spec;
out:
free(spec);
return NULL;
}
/**
* It closes a SPEC device opened with one of the following function:
* spec_open_by_id()
* @param[in] dev device token
*/
void spec_close(struct spec_node *dev)
{
struct spec_desc *spec = (struct spec_desc *)dev;
trtl_close(spec->trtl);
free(spec);
dev = NULL;
}
/**
* It returns the WRNC token in order to allows users to run
* functions from the WRNC library
* @param[in] dev device token
* @return the WRNC token
*/
struct trtl_dev *spec_get_trtl_dev(struct spec_node *dev)
{
struct spec_desc *spec = (struct spec_desc *)dev;
return (struct trtl_dev *)spec->trtl;
}
static int spec_cfg_is_valid(struct spec_cfg *cfg)
{
if (cfg->led >= __SPEC_LED_MODE_MAX)
return 0;
if (cfg->btn[0] >= __SPEC_BTN_MAX)
return 0;
if (cfg->btn[1] >= __SPEC_BTN_MAX)
return 0;
return 1;
}
/**
* Get firmware configuration
* @param[in] dev device token
* @param[out] cfg configuration read from Mock Turtle
*/
int spec_configuration_get(struct spec_node *dev, struct spec_cfg *cfg)
{
struct spec_desc *spec = (struct spec_desc *)dev;
struct trtl_tlv tlv = {
.type = SPEC_BUF_CFG,
.size = sizeof(struct spec_cfg),
.buf = cfg,
};
int err;
err = trtl_fw_buffer_get(spec->trtl,
SPEC_CPU_MANUAL, SPEC_CPU_MANUAL_HMQ,
&tlv, 1);
if (err)
return err;
if (!spec_cfg_is_valid(cfg)) {
errno = ESPEC_INVALID_CONFIG;
return -1;
}
return 0;
}
/**
* Set firmwae configuration
* @param[in] dev device token
* @param[out] cfg configuration read from Mock Turtle
*/
int spec_configuration_set(struct spec_node *dev, struct spec_cfg *cfg)
{
struct spec_desc *spec = (struct spec_desc *)dev;
struct trtl_tlv tlv = {
.type = SPEC_BUF_CFG,
.size = sizeof(struct spec_cfg),
.buf = cfg,
};
if (!spec_cfg_is_valid(cfg)) {
errno = ESPEC_INVALID_CONFIG;
return -1;
}
return trtl_fw_buffer_set(spec->trtl,
SPEC_CPU_MANUAL, SPEC_CPU_MANUAL_HMQ,
&tlv, 1);
}
int spec_version(struct spec_node *dev, struct trtl_fw_version *version)
{
struct spec_desc *spec = (struct spec_desc *)dev;
return trtl_fw_version(spec->trtl,
SPEC_CPU_MANUAL, SPEC_CPU_MANUAL_HMQ,
version);
}
/*
* Copyright (C) 2018 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
#ifndef __LIBSPEC_H__
#define __LIBSPEC_H__
/** @file libspec.h */
#include <spec-common.h>
struct spec_node;
enum spec_error_list {
__ESPEC_MIN_ERROR_NUMBER = 3200,
ESPEC_INVALID_CONFIG = __ESPEC_MIN_ERROR_NUMBER,
/*
* Add new messages here.
* The first one must be equal to __ESPEC_MIN_ERROR_NUMBER
*/
__ESPEC_MAX_ERROR_NUMBER,
};
/**
* @defgroup util Generic Functions
* Generic funcions to handle fmc-spec-carrier devices
* @{
*/
extern const char *spec_btn_to_name(enum spec_btn_mode mode);
extern const char *spec_strerror(unsigned int error);
extern int spec_init();
extern void spec_exit();
extern struct spec_node *spec_open_by_id(uint32_t device_id);
extern void spec_close(struct spec_node *dev);
extern struct trtl_dev *spec_get_trtl_dev(struct spec_node *dev);
extern int spec_version(struct spec_node *dev, struct trtl_fw_version *version);
extern int spec_configuration_get(struct spec_node *dev, struct spec_cfg *cfg);
extern int spec_configuration_set(struct spec_node *dev, struct spec_cfg *cfg);
/**@}*/
#endif
# If it exists includes Makefile.specific. In this Makefile, you should put
# specific Makefile code that you want to run before this. For example,
# build a particular environment.
-include Makefile.specific
TRTL ?= ../../../../
TRTL_SW = $(TRTL)/software
# include parent_common.mk for buildsystem's defines
REPO_PARENT ?= $(TRTL)/..
-include $(REPO_PARENT)/parent_common.mk
DESTDIR ?= /usr/local
CFLAGS += -Wall -ggdb
CFLAGS += -I. -I../include -I../lib
CFLAGS += -I$(TRTL_SW)/include -I$(TRTL_SW)/lib
CFLAGS += $(EXTRACFLAGS)
LDFLAGS += -L../lib -L$(TRTL_SW)/lib
LDLIBS += -Wl,-Bstatic -lspec -lmockturtle
LDLIBS += -Wl,-Bdynamic
PROGS := mockturtle-spec
all: $(PROGS)
install:
install -d $(DESTDIR)/bin
install -D $(PROGS) $(DESTDIR)/bin
mockturtle-spec: $(TRTL_SW)/lib/libmockturtle.a
$(TRTL_SW)/lib/libmockturtle.a:
$(MAKE) -C $(@D)
# TODO add rules to compile your programs
# make nothing for modules_install, but avoid errors
modules_install:
clean:
rm -f $(PROGS) *.o *~
cleanall: clean
.PHONY: all clean cleanall
/*
* Copyright (C) 2018 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*/
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <getopt.h>
#include <libspec.h>
#include <inttypes.h>
static void help()
{
fprintf(stderr,
"spec -D 0x<hex-number> -c -b <idx>,<mode> -l <mode>\n");
fprintf(stderr, "-D device id\n");
fprintf(stderr, "-c show current configuration\n");
fprintf(stderr, "-l led mode [0, 1, 2]\n");
fprintf(stderr, "-b assign button mode [r: RESET, p: PAUSE]\n");
fprintf(stderr, "-v show version\n");
fprintf(stderr, "\n");
exit(1);
}
static void spec_print_status(struct spec_cfg *cfg)
{
fprintf(stdout, "Status:\n");
fprintf(stdout, "\tled\t%d\n", cfg->led);
fprintf(stdout, "\tbutton 1\t%s\n", spec_btn_to_name(cfg->btn[0]));
fprintf(stdout, "\tbutton 2\t%s\n", spec_btn_to_name(cfg->btn[1]));
}
static void spec_print_version(struct trtl_fw_version *version)
{
fprintf(stdout, "Version:\n");
fprintf(stdout, "\tRT: 0x%x\n", version->rt_id);
fprintf(stdout, "\tRT Version: 0x%x\n", version->rt_version);
fprintf(stdout, "\tGit Version: 0x%x\n", version->git_version);
}
int main(int argc, char *argv[])
{
struct spec_node *spec;
struct spec_cfg cfg, ccfg;
uint32_t dev_id = 0;
char c;
int err = 0, show_config = 0, show_version = 0;
struct trtl_fw_version version;
while ((c = getopt (argc, argv, "hD:cl:b:v")) != -1) {
switch (c) {
case 'h':
case '?':
help();
break;
case 'D':
sscanf(optarg, "0x%x", &dev_id);
break;
case 'c':
show_config = 1;
break;
case 'v':
show_version = 1;
break;
}
}
if (dev_id == 0) {
help();
exit(1);
}
atexit(spec_exit);
err = spec_init();
if (err) {
fprintf(stderr, "Cannot init spec library: %s\n",
spec_strerror(errno));
exit(1);
}
spec = spec_open_by_id(dev_id);
if (!spec) {
fprintf(stderr, "Cannot open spec: %s\n", spec_strerror(errno));
exit(1);
}
/* Get current configuration and modify it */
err = spec_configuration_get(spec, &ccfg);
if (err)
fprintf(stderr, "Cannot get configuration: %s\n", spec_strerror(errno));
memcpy(&cfg, &ccfg, sizeof(struct spec_cfg));
optind = 0;
while ((c = getopt (argc, argv, "hD:cl:b:v")) != -1) {
int ret;
switch (c) {
case 'l':
ret = sscanf(optarg, "%d", &cfg.led);
if (ret != 1) {
fprintf(stderr, "Invalid argument for LED mode\n");
help();
}
break;
case 'b': {
int idx;
char mode;
ret = sscanf(optarg, "%d,%c", &idx, &mode);
if (ret != 2) {
fprintf(stderr, "Invalid argument for button\n");
help();
}
switch (mode) {
case 'r':
cfg.btn[idx] = SPEC_BTN_RESET;
break;
case 'p':
cfg.btn[idx] = SPEC_BTN_PAUSE;
break;
default:
fprintf(stderr, "Invalid button mode\n");
help();
spec_close(spec);
exit(1);
break;
}
break;
}
}
}
/* If something changes, reprogram */
if (memcmp(&cfg, &ccfg, sizeof(struct spec_cfg)) != 0) {
err = spec_configuration_set(spec, &cfg);
if (err)
fprintf(stderr, "Cannot set configuration: %s\n", spec_strerror(errno));
}
if (show_config) {
/* Get the current status */
err = spec_configuration_get(spec, &cfg);
if (err)
fprintf(stderr, "Cannot get configuration: %s\n", spec_strerror(errno));
else
spec_print_status(&cfg);
}
if (show_version) {
err = spec_version(spec, &version);
if (err)
fprintf(stderr, "Cannot get version: %s\n",
spec_strerror(errno));
else
spec_print_version(&version);
}
spec_close(spec);
exit(0);
}
......@@ -67,9 +67,9 @@ For each one of the two configured soft CPUs, their respective DP interface is a
Wishbone GPIO peripheral. The outputs from the two GPIO peripherals are logically OR'ed, while their
inputs are copies of the same signals. The mapping of these 8 signals is the following:
+ GPIO0 to GPIO1: Two push buttons on the SPEC board
+ GPIO2 to GPIO5: Four LEDs on the SPEC board
+ GPIO6 to GPIO7: Two LEDs on the front panel of the SPEC
+ GPIO0 to GPIO1: Two push buttons on the SPEC board (0 button pressed, 1 button released)
+ GPIO2 to GPIO5: Four LEDs on the SPEC board (1 LED on, 0 LED off)
+ GPIO6 to GPIO7: Two LEDs on the front panel of the SPEC (1 LED on, 0 LED off)
All mentioned peripherals (WB crossbar, VIC, WB GPIO) are available as part of `OHWR
general-cores`_. The SPEC demo also uses the Gennum `GN4124 core`_ to provide the host interface.
......
gn4124-core @ 5ffe9f53
Subproject commit e7cd73db41ba056ed4b27731c21a3b2aa53eaa51
Subproject commit 5ffe9f5344e22262d1badeef21b8426d20948368
*
!.gitignore
!Manifest.py
!spec_mt_demo.ucf
action = "synthesis"
target = "xilinx"
fetchto = "../../ip_cores"
syn_device = "xc6slx45t"
syn_grade = "-3"
syn_package = "fgg484"
syn_top = "spec_mt_demo"
syn_project = "spec_mt_demo.xise"
top_module = "spec_mt_demo"
syn_tool = "ise"
syn_post_project_cmd = "$(TCL_INTERPRETER) " + \
fetchto + "/general-cores/tools/sdb_desc_gen.tcl " + \
syn_tool + " $(PROJECT_FILE)"
files = [
"spec_mt_demo.ucf",
]
modules = {
"local" : [
"../../top/spec_mt_demo",
],
"git" : [
"git://ohwr.org/hdl-core-lib/general-cores.git",
"git://ohwr.org/hdl-core-lib/urv-core.git",
"git://ohwr.org/hdl-core-lib/gn4124-core.git",
],
}
NET "clk_125m_pllref_n_i" LOC = F10;
NET "clk_125m_pllref_n_i" IOSTANDARD = "LVDS_25";
NET "clk_125m_pllref_p_i" LOC = G9;
NET "clk_125m_pllref_p_i" IOSTANDARD = "LVDS_25";
###########################################################################
## GN4124 PCIe bridge signals
###########################################################################
NET "gn_rst_n_i" LOC = N20;
NET "gn_rst_n_i" IOSTANDARD = "LVCMOS18";
NET "gn_p2l_clk_n_i" LOC = M19;
NET "gn_p2l_clk_n_i" IOSTANDARD = "DIFF_SSTL18_I";
NET "gn_p2l_clk_p_i" LOC = M20;
NET "gn_p2l_clk_p_i" IOSTANDARD = "DIFF_SSTL18_I";
NET "gn_p2l_rdy_o" LOC = J16;
NET "gn_p2l_rdy_o" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_dframe_i" LOC = J22;
NET "gn_p2l_dframe_i" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_valid_i" LOC = L19;
NET "gn_p2l_valid_i" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[0]" LOC = K20;
NET "gn_p2l_data_i[0]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[1]" LOC = H22;
NET "gn_p2l_data_i[1]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[2]" LOC = H21;
NET "gn_p2l_data_i[2]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[3]" LOC = L17;
NET "gn_p2l_data_i[3]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[4]" LOC = K17;
NET "gn_p2l_data_i[4]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[5]" LOC = G22;
NET "gn_p2l_data_i[5]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[6]" LOC = G20;
NET "gn_p2l_data_i[6]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[7]" LOC = K18;
NET "gn_p2l_data_i[7]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[8]" LOC = K19;
NET "gn_p2l_data_i[8]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[9]" LOC = H20;
NET "gn_p2l_data_i[9]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[10]" LOC = J19;
NET "gn_p2l_data_i[10]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[11]" LOC = E22;
NET "gn_p2l_data_i[11]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[12]" LOC = E20;
NET "gn_p2l_data_i[12]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[13]" LOC = F22;
NET "gn_p2l_data_i[13]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[14]" LOC = F21;
NET "gn_p2l_data_i[14]" IOSTANDARD = "SSTL18_I";
NET "gn_p2l_data_i[15]" LOC = H19;
NET "gn_p2l_data_i[15]" IOSTANDARD = "SSTL18_I";
NET "gn_p_wr_req_i[0]" LOC = M22;
NET "gn_p_wr_req_i[0]" IOSTANDARD = "SSTL18_I";
NET "gn_p_wr_req_i[1]" LOC = M21;
NET "gn_p_wr_req_i[1]" IOSTANDARD = "SSTL18_I";
NET "gn_p_wr_rdy_o[0]" LOC = L15;
NET "gn_p_wr_rdy_o[0]" IOSTANDARD = "SSTL18_I";
NET "gn_p_wr_rdy_o[1]" LOC = K16;
NET "gn_p_wr_rdy_o[1]" IOSTANDARD = "SSTL18_I";
NET "gn_rx_error_o" LOC = J17;
NET "gn_rx_error_o" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_clkn_o" LOC = K22;
NET "gn_l2p_clkn_o" IOSTANDARD = "DIFF_SSTL18_I";
NET "gn_l2p_clkp_o" LOC = K21;
NET "gn_l2p_clkp_o" IOSTANDARD = "DIFF_SSTL18_I";
NET "gn_l2p_dframe_o" LOC = U22;
NET "gn_l2p_dframe_o" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_valid_o" LOC = T18;
NET "gn_l2p_valid_o" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_edb_o" LOC = U20;
NET "gn_l2p_edb_o" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[0]" LOC = P16;
NET "gn_l2p_data_o[0]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[1]" LOC = P21;
NET "gn_l2p_data_o[1]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[2]" LOC = P18;
NET "gn_l2p_data_o[2]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[3]" LOC = T20;
NET "gn_l2p_data_o[3]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[4]" LOC = V21;
NET "gn_l2p_data_o[4]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[5]" LOC = V19;
NET "gn_l2p_data_o[5]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[6]" LOC = W22;
NET "gn_l2p_data_o[6]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[7]" LOC = Y22;
NET "gn_l2p_data_o[7]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[8]" LOC = P22;
NET "gn_l2p_data_o[8]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[9]" LOC = R22;
NET "gn_l2p_data_o[9]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[10]" LOC = T21;
NET "gn_l2p_data_o[10]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[11]" LOC = T19;
NET "gn_l2p_data_o[11]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[12]" LOC = V22;
NET "gn_l2p_data_o[12]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[13]" LOC = V20;
NET "gn_l2p_data_o[13]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[14]" LOC = W20;
NET "gn_l2p_data_o[14]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_data_o[15]" LOC = Y21;
NET "gn_l2p_data_o[15]" IOSTANDARD = "SSTL18_I";
NET "gn_l2p_rdy_i" LOC = U19;
NET "gn_l2p_rdy_i" IOSTANDARD = "SSTL18_I";
NET "gn_l_wr_rdy_i[0]" LOC = R20;
NET "gn_l_wr_rdy_i[0]" IOSTANDARD = "SSTL18_I";
NET "gn_l_wr_rdy_i[1]" LOC = T22;
NET "gn_l_wr_rdy_i[1]" IOSTANDARD = "SSTL18_I";
NET "gn_p_rd_d_rdy_i[0]" LOC = N16;
NET "gn_p_rd_d_rdy_i[0]" IOSTANDARD = "SSTL18_I";
NET "gn_p_rd_d_rdy_i[1]" LOC = P19;
NET "gn_p_rd_d_rdy_i[1]" IOSTANDARD = "SSTL18_I";
NET "gn_tx_error_i" LOC = M17;
NET "gn_tx_error_i" IOSTANDARD = "SSTL18_I";
NET "gn_vc_rdy_i[0]" LOC = B21;
NET "gn_vc_rdy_i[0]" IOSTANDARD = "SSTL18_I";
NET "gn_vc_rdy_i[1]" LOC = B22;
NET "gn_vc_rdy_i[1]" IOSTANDARD = "SSTL18_I";
NET "gn_gpio_b[1]" LOC = U16;
NET "gn_gpio_b[1]" IOSTANDARD = "LVCMOS25";
NET "gn_gpio_b[0]" LOC = AB19;
NET "gn_gpio_b[0]" IOSTANDARD = "LVCMOS25";
###########################################################################
## Miscellanous SPEC pins
###########################################################################
NET "fp_led_green_o" LOC = E5;
NET "fp_led_green_o" IOSTANDARD = "LVCMOS25";
NET "fp_led_red_o" LOC = D5;
NET "fp_led_red_o" IOSTANDARD = "LVCMOS25";
NET "brd_led_o[0]" LOC = G19;
NET "brd_led_o[0]" IOSTANDARD = "LVCMOS18";
NET "brd_led_o[1]" LOC = F20;
NET "brd_led_o[1]" IOSTANDARD = "LVCMOS18";
NET "brd_led_o[2]" LOC = F18;
NET "brd_led_o[2]" IOSTANDARD = "LVCMOS18";
NET "brd_led_o[3]" LOC = C20;
NET "brd_led_o[3]" IOSTANDARD = "LVCMOS18";
NET "brd_button_i[0]" LOC = C22;
NET "brd_button_i[0]" IOSTANDARD = "LVCMOS18";
NET "brd_button_i[1]" LOC = D21;
NET "brd_button_i[1]" IOSTANDARD = "LVCMOS18";
NET "gn_rst_n_i" TIG;
NET "gn_p2l_clk_p_i" TNM_NET = p2l_clk_p_i;
TIMESPEC TS_p2l_clk_p_i = PERIOD "p2l_clk_p_i" 5 ns HIGH 50%;
NET "gn_p2l_clk_n_i" TNM_NET = p2l_clk_n_i;
TIMESPEC TS_p2l_clk_n_i = PERIOD "p2l_clk_n_i" 5 ns HIGH 50%;
NET "clk_125m_pllref_p_i" TNM_NET = clk_125m_pllref_p_i;
TIMESPEC TS_clk_125m_pllref_p_i = PERIOD "clk_125m_pllref_p_i" 8 ns HIGH 50%;
NET "clk_125m_pllref_n_i" TNM_NET = clk_125m_pllref_n_i;
TIMESPEC TS_clk_125m_pllref_n_i = PERIOD "clk_125m_pllref_n_i" 8 ns HIGH 50%;
......@@ -3,7 +3,7 @@
#
# Author: Adam Wujek, CERN 2017
TB_DIRS=mock_turtle_core svec_mt_demo
TB_DIRS=mock_turtle_core svec_mt_demo spec_mt_demo
#TB_DIRS+=spec_ref_design-verification
test_results_xml=test_results.xml
......@@ -11,13 +11,16 @@ test_results_xml=test_results.xml
all: $(TB_DIRS) summary summary_total summary_xml
MOCK_TURTLE_CORE_RT_BIN = ../../tests/firmware/sim-verif/sim-verif.bin
mock_turtle_core: $(MOCK_TURTLE_CORE_RT_BIN)
MT_VERF_RT_BIN = ../../tests/firmware/sim-verif/sim-verif.bin
MT_DEMO_RT_BIN = ../../demos/hello_world/firmware/fw-01/fw-hello.bin
SVEC_MT_DEMO_RT_BIN = ../../demos/hello_world/firmware/fw-01/fw-hello.bin
svec_mt_demo: $(SVEC_MT_DEMO_RT_BIN)
mock_turtle_core: $(MT_VERF_RT_BIN)
$(SVEC_MT_DEMO_RT_BIN) $(MOCK_TURTLE_CORE_RT_BIN):
svec_mt_demo: $(MT_DEMO_RT_BIN)
spec_mt_demo: $(MT_DEMO_RT_BIN)
$(MT_DEMO_RT_BIN) $(MT_VERF_RT_BIN):
$(MAKE) -C $(@D) defconfig
$(MAKE) -C $(@D)
......
work/
Makefile
modelsim.ini
transcript*
*.wlf
# HDLMake 'develop' branch required.
#
# Due to bugs in release v3.0 of hdlmake it is necessary to use the "develop"
# branch of hdlmake, commit db4e1ab.
sim_tool = "modelsim"
sim_top = "main"
action = "simulation"
target = "xilinx"
syn_device = "xc6slx45t"
vcom_opt = "-93 -mixedsvvh"
include_dirs = [
"../include/",
"../include/regs/",
"../../ip_cores/general-cores/sim/",
"../../ip_cores/urv-core/rtl/",
]
files = [
"main.sv",
"synthesis_descriptor.vhd",
]
modules = {
"local" : [
"../../top/spec_mt_demo",
],
"git" : [
"git://ohwr.org/hdl-core-lib/general-cores.git",
"git://ohwr.org/hdl-core-lib/urv-core.git",
"git://ohwr.org/hdl-core-lib/gn4124-core.git",
],
}
fetchto = "../../ip_cores"
//------------------------------------------------------------------------------
// CERN BE-CO-HT
// Mock Turtle
// https://gitlab.cern.ch/coht/mockturtle
//------------------------------------------------------------------------------
//
// unit name: main
//
// description: A SystemVerilog testbench for the supplied SPEC MT demo.
//
//------------------------------------------------------------------------------
// Copyright CERN 2018
//------------------------------------------------------------------------------
// Copyright and related rights are licensed under the Solderpad Hardware
// License, Version 2.0 (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
// http://solderpad.org/licenses/SHL-2.0.
// Unless required by applicable law or agreed to in writing, software,
// hardware and materials distributed under this License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions
// and limitations under the License.
//------------------------------------------------------------------------------
`include "mock_turtle_driver.svh"
`include "vhd_wishbone_master.svh"
`timescale 1ns/1ps
module main;
reg clk_125m = 0;
always #4ns clk_125m <= ~clk_125m;
// the Device Under Test
spec_mt_demo #
(
.g_sim_bypass_pcie(1)
)
DUT
(
.clk_125m_pllref_p_i (clk_125m),
.clk_125m_pllref_n_i (~clk_125m),
.fp_led_green_o (),
.fp_led_red_o (),
.brd_button_i (),
.brd_led_o (),
.sim_wb_i (Host.out),
.sim_wb_o (Host.in),
.gn_rst_n_i (),
.gn_p2l_clk_n_i (),
.gn_p2l_clk_p_i (),
.gn_p2l_rdy_o (),
.gn_p2l_dframe_i (),
.gn_p2l_valid_i (),
.gn_p2l_data_i (),
.gn_p_wr_req_i (),
.gn_p_wr_rdy_o (),
.gn_rx_error_o (),
.gn_l2p_clkn_o (),
.gn_l2p_clkp_o (),
.gn_l2p_dframe_o (),
.gn_l2p_valid_o (),
.gn_l2p_edb_o (),
.gn_l2p_data_o (),
.gn_l2p_rdy_i (),
.gn_l_wr_rdy_i (),
.gn_p_rd_d_rdy_i (),
.gn_tx_error_i (),
.gn_vc_rdy_i (),
.gn_gpio_b ());
IVHDWishboneMaster Host
(
.clk_i (DUT.clk_sys),
.rst_n_i (DUT.rst_sys_n));
IMockTurtleIRQ IrqMonitor (`MT_ATTACH_IRQ(DUT.U_Mock_Turtle));
string fw = "../../../demos/hello_world/firmware/fw-01/fw-hello.bin";
const uint64_t mt_base = 'h2_0000;
MockTurtleDriver drv;
initial begin
@(posedge DUT.rst_sys_n);
@(posedge DUT.clk_sys);
drv = new (Host.get_accessor(), mt_base, IrqMonitor);
drv.init();
drv.enable_console_irq (0, 1);
drv.load_firmware(0, fw, 1'b0);
drv.reset_core(0, 0);
forever begin
drv.update ();
#1us;
end
end // initial begin
endmodule // main
vsim -quiet -L unisim work.main -novopt
set StdArithNoWarnings 1
set NumericStdNoWarnings 1
radix -hexadecimal
log -r /*
run 300us
# Modelsim run script for continuous integration
# execute: vsim -c -do "run_ci.do"
vsim -quiet -L unisim work.main
set StdArithNoWarnings 1
set NumericStdNoWarnings 1
run 500us
exit
--------------------------------------------------------------------------------
-- SDB meta information for svec_mt_demo.xise.
--
-- This file was automatically generated by ../../ip_cores/general-cores/tools/sdb_desc_gen.tcl on:
-- Tuesday, March 13 2018
--
-- ../../ip_cores/general-cores/tools/sdb_desc_gen.tcl is part of OHWR general-cores:
-- https://www.ohwr.org/projects/general-cores/wiki
--
-- For more information on SDB meta information, see also:
-- https://www.ohwr.org/projects/sdb/wiki
--------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use work.wishbone_pkg.all;
package synthesis_descriptor is
constant c_sdb_synthesis_info : t_sdb_synthesis := (
syn_module_name => "spec_mt_demo ",
syn_commit_id => "7c77f1c604c76e8fb82b4ce54acc32a9",
syn_tool_name => "ISE ",
syn_tool_version => x"00000147",
syn_date => x"20180313",
syn_username => "Dimitris Lampri");
constant c_sdb_repo_url : t_sdb_repo_url := (
repo_url => "ssh://git@gitlab.cern.ch:7999/coht/mockturtle.git ");
end package synthesis_descriptor;
files = [
"spec_mt_demo.vhd",
]
modules = {
"local" : [
"../../rtl",
],
}
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment