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 ...@@ -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 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: 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 + 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 + 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 + 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 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. 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 @@ ...@@ -3,7 +3,7 @@
# #
# Author: Adam Wujek, CERN 2017 # 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 #TB_DIRS+=spec_ref_design-verification
test_results_xml=test_results.xml test_results_xml=test_results.xml
...@@ -11,13 +11,16 @@ test_results_xml=test_results.xml ...@@ -11,13 +11,16 @@ test_results_xml=test_results.xml
all: $(TB_DIRS) summary summary_total summary_xml all: $(TB_DIRS) summary summary_total summary_xml
MOCK_TURTLE_CORE_RT_BIN = ../../tests/firmware/sim-verif/sim-verif.bin MT_VERF_RT_BIN = ../../tests/firmware/sim-verif/sim-verif.bin
mock_turtle_core: $(MOCK_TURTLE_CORE_RT_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 mock_turtle_core: $(MT_VERF_RT_BIN)
svec_mt_demo: $(SVEC_MT_DEMO_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) defconfig
$(MAKE) -C $(@D) $(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