OpenCores
URL https://opencores.org/ocsvn/uart8systemc/uart8systemc/trunk

Subversion Repositories uart8systemc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /uart8systemc
    from Rev 6 to Rev 7
    Reverse comparison

Rev 6 → Rev 7

/trunk/testbench/module_tb.v
3,6 → 3,7
module module_tb;
 
reg CLK;
 
wire RESET;
wire RX;
wire START;
14,12 → 15,9
wire READY_TX;
wire READY;
 
assign DATA_TX = DATA_RX;
 
initial CLK = 1'b0;
always #(10) CLK = ~CLK;
 
integer i;
integer a;
//assign DATA_TX = DATA_RX;
 
initial
begin
27,8 → 25,12
$dumpvars(0,module_tb);
$global_init;
i=0;
a=10;
end
 
initial CLK = 1'b0;
always #(a) CLK = ~CLK;
 
UART DUT(
.CLK(CLK),
.RESET(RESET),
48,15 → 50,12
$reset_uart;
 
always@(posedge CLK)
$execute_uart;
$run_sim;
 
always@(posedge CLK)
$global_counter;
 
//FLAG USED TO FINISH SIMULATION PROGRAM
always@(posedge CLK)
begin
wait(i == 1);
wait(i == 1);
$finish();
end
 
/trunk/work/sc_uart.so Cannot display: file marked as a binary type. svn:mime-type = application/x-sharedlib
/trunk/work/run.sh
1,8 → 1,7
g++ -c -ldl -fpic ../vpi/env_uart.cpp -std=c++11 -Wwrite-strings -fpermissive
 
g++ -c -ldl -fpic ../vpi/env_uart.cpp -std=c++11 -Wwrite-strings -fpermissive
g++ -shared -oenv_uart.vpi env_uart.o -lvpi -std=c++11 -Wwrite-strings -fpermissive
 
g++ -shared -oenv_uart.vpi env_uart.o -lvpi -std=c++11 -Wwrite-strings -fpermissive
iverilog -oenv_uart.vvp ../rtl/*.v ../testbench/module_tb.v
 
iverilog -oenv_uart ../rtl/*.v ../testbench/module_tb.v
 
vvp -M. -menv_uart env_uart
vvp -M. -menv_uart env_uart.vvp
/trunk/systemC/link_sc.h
8,17 → 8,19
Control_SC();
/*initialize systemC model*/
virtual void init();
//virtual void init();
 
/*Reset the model*/
virtual void reset_set_high();
virtual void reset_set_low();
virtual bool reset_set();
virtual void clear_validation();
 
/*This is used to configure clock on systemC model note here you must put period T = 1/F*/
virtual void set_period_clock_sc(unsigned value_freq);
/*Finish Simulation*/
virtual unsigned int finish_simulation();
 
/*This must be used to set baud value on Env. Ex: 9600 / 50MHz"Only 50"*/
virtual void set_baud_rate(unsigned int value_baud,unsigned frequency);
/**/
virtual unsigned int set_clock_rtl();
virtual bool enable_change();
 
/*Get the baud rate and set it to your DUT*/
virtual int get_baud_rate();
 
26,6 → 28,9
virtual void write_rx(unsigned int a);
virtual int read_tx();
 
/**/
virtual void get_value_sc_vlog(unsigned int value,unsigned int parity);
 
/*Run the Env for a mmount off time*/
virtual void run_sim();
 
/trunk/README.md
3,7 → 3,7
 
###Donate and help us "Bitcoin is the future"
 
- 16tCHCq1nMZVDQeYTVwFXjzz53hnHSA2Q3
- 1CSZ9nHBWxLaf1nU9E9E15GAjKcYXD1wnV
 
###ABOUT this UART
 
19,7 → 19,6
- Promoting microelectronics interested people on Latin America
- Teamwork
 
 
###Requisites
 
- Linux Distro
26,6 → 25,10
- Icarus verilog [http://iverilog.icarus.com/]
- SystemC 2.3 [http://accellera.org/downloads/standards/systemc]
- gtkwave [http://gtkwave.sourceforge.net/]
- gtk3
- libboost
- gtkmm
- glade
 
*Obs: you need alredy know how to compile and understand concepts and how work icarus / SystemC / linux tools
 
42,14 → 45,86
The result of command should be this
 
```sh
linux-vdso.so.1 (0x00007ffd92ffe000)
libsystemc-2.3.0.so => /lib64/libsystemc-2.3.0.so (0x00007f24c2420000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f24c209d000)
libm.so.6 => /lib64/libm.so.6 (0x00007f24c1d9c000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f24c1b85000)
libc.so.6 => /lib64/libc.so.6 (0x00007f24c17de000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f24c15c0000)
/lib64/ld-linux-x86-64.so.2 (0x000056321eb36000)
linux-vdso.so.1 (0x00007ffe3c1ec000)
libsystemc-2.3.0.so => /systemc-2.3.0/lib-linux64/libsystemc-2.3.0.so (0x00007f752f1ef000)
libgtkmm-3.0.so.1 => /usr/lib64/libgtkmm-3.0.so.1 (0x00007f752ea75000)
libatkmm-1.6.so.1 => /usr/lib64/libatkmm-1.6.so.1 (0x00007f752e828000)
libgdkmm-3.0.so.1 => /usr/lib64/libgdkmm-3.0.so.1 (0x00007f752e5e1000)
libgiomm-2.4.so.1 => /usr/lib64/libgiomm-2.4.so.1 (0x00007f752e234000)
libpangomm-1.4.so.1 => /usr/lib64/libpangomm-1.4.so.1 (0x00007f752e006000)
libglibmm-2.4.so.1 => /usr/lib64/libglibmm-2.4.so.1 (0x00007f752dd8c000)
libgtk-3.so.0 => /usr/lib64/libgtk-3.so.0 (0x00007f752d4ac000)
libgdk-3.so.0 => /usr/lib64/libgdk-3.so.0 (0x00007f752d1ff000)
libpangocairo-1.0.so.0 => /usr/lib64/libpangocairo-1.0.so.0 (0x00007f752cff2000)
libpango-1.0.so.0 => /usr/lib64/libpango-1.0.so.0 (0x00007f752cda6000)
libatk-1.0.so.0 => /usr/lib64/libatk-1.0.so.0 (0x00007f752cb80000)
libcairo-gobject.so.2 => /usr/lib64/libcairo-gobject.so.2 (0x00007f752c977000)
libgio-2.0.so.0 => /usr/lib64/libgio-2.0.so.0 (0x00007f752c5f7000)
libcairomm-1.0.so.1 => /usr/lib64/libcairomm-1.0.so.1 (0x00007f752c3d1000)
libcairo.so.2 => /usr/lib64/libcairo.so.2 (0x00007f752c0af000)
libsigc-2.0.so.0 => /usr/lib64/libsigc-2.0.so.0 (0x00007f752bea8000)
libgdk_pixbuf-2.0.so.0 => /usr/lib64/libgdk_pixbuf-2.0.so.0 (0x00007f752bc85000)
libgobject-2.0.so.0 => /usr/lib64/libgobject-2.0.so.0 (0x00007f752ba34000)
libglib-2.0.so.0 => /usr/lib64/libglib-2.0.so.0 (0x00007f752b724000)
libboost_thread.so.1.54.0 => /usr/lib64/libboost_thread.so.1.54.0 (0x00007f752b50c000)
libboost_system.so.1.54.0 => /usr/lib64/libboost_system.so.1.54.0 (0x00007f752b308000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f752af83000)
libm.so.6 => /lib64/libm.so.6 (0x00007f752ac82000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f752aa6b000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f752a84d000)
libc.so.6 => /lib64/libc.so.6 (0x00007f752a4a5000)
libgmodule-2.0.so.0 => /usr/lib64/libgmodule-2.0.so.0 (0x00007f752a2a0000)
libX11.so.6 => /usr/lib64/libX11.so.6 (0x00007f7529f62000)
libXi.so.6 => /usr/lib64/libXi.so.6 (0x00007f7529d52000)
libXfixes.so.3 => /usr/lib64/libXfixes.so.3 (0x00007f7529b4b000)
libatk-bridge-2.0.so.0 => /usr/lib64/libatk-bridge-2.0.so.0 (0x00007f752991d000)
libepoxy.so.0 => /usr/lib64/libepoxy.so.0 (0x00007f7529623000)
libpangoft2-1.0.so.0 => /usr/lib64/libpangoft2-1.0.so.0 (0x00007f752940e000)
libfontconfig.so.1 => /usr/lib64/libfontconfig.so.1 (0x00007f75291d1000)
libXinerama.so.1 => /usr/lib64/libXinerama.so.1 (0x00007f7528fce000)
libXrandr.so.2 => /usr/lib64/libXrandr.so.2 (0x00007f7528dc2000)
libXcursor.so.1 => /usr/lib64/libXcursor.so.1 (0x00007f7528bb7000)
libXcomposite.so.1 => /usr/lib64/libXcomposite.so.1 (0x00007f75289b4000)
libXdamage.so.1 => /usr/lib64/libXdamage.so.1 (0x00007f75287b0000)
libXext.so.6 => /usr/lib64/libXext.so.6 (0x00007f752859e000)
librt.so.1 => /lib64/librt.so.1 (0x00007f7528396000)
libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x00007f75280fe000)
libz.so.1 => /lib64/libz.so.1 (0x00007f7527ee8000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f7527cc3000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f7527aac000)
libpixman-1.so.0 => /usr/lib64/libpixman-1.so.0 (0x00007f7527801000)
libEGL.so.1 => /usr/lib64/libEGL.so.1 (0x00007f75275d8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f75273d4000)
libpng16.so.16 => /usr/lib64/libpng16.so.16 (0x00007f7527197000)
libxcb-shm.so.0 => /usr/lib64/libxcb-shm.so.0 (0x00007f7526f93000)
libxcb-render.so.0 => /usr/lib64/libxcb-render.so.0 (0x00007f7526d89000)
libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x00007f7526b69000)
libXrender.so.1 => /usr/lib64/libXrender.so.1 (0x00007f752695e000)
libGL.so.1 => /usr/lib64/libGL.so.1 (0x00007f75266cd000)
libffi.so.4 => /usr/lib64/libffi.so.4 (0x00007f75264c3000)
libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007f752625d000)
/lib64/ld-linux-x86-64.so.2 (0x0000563bbfa45000)
libatspi.so.0 => /usr/lib64/libatspi.so.0 (0x00007f752602c000)
libdbus-1.so.3 => /lib64/libdbus-1.so.3 (0x00007f7525de5000)
libharfbuzz.so.0 => /usr/lib64/libharfbuzz.so.0 (0x00007f7525b85000)
libexpat.so.1 => /usr/lib64/libexpat.so.1 (0x00007f752595a000)
libbz2.so.1 => /usr/lib64/libbz2.so.1 (0x00007f752574b000)
libX11-xcb.so.1 => /usr/lib64/libX11-xcb.so.1 (0x00007f7525548000)
libxcb-dri2.so.0 => /usr/lib64/libxcb-dri2.so.0 (0x00007f7525343000)
libxcb-xfixes.so.0 => /usr/lib64/libxcb-xfixes.so.0 (0x00007f752513c000)
libgbm.so.1 => /usr/lib64/libgbm.so.1 (0x00007f7524f2d000)
libwayland-client.so.0 => /usr/lib64/libwayland-client.so.0 (0x00007f7524d1f000)
libwayland-server.so.0 => /usr/lib64/libwayland-server.so.0 (0x00007f7524b0d000)
libdrm.so.2 => /usr/lib64/libdrm.so.2 (0x00007f75248fd000)
libXau.so.6 => /usr/lib64/libXau.so.6 (0x00007f75246f9000)
libglapi.so.0 => /usr/lib64/libglapi.so.0 (0x00007f75244ca000)
libxcb-glx.so.0 => /usr/lib64/libxcb-glx.so.0 (0x00007f75242b2000)
libxcb-dri3.so.0 => /usr/lib64/libxcb-dri3.so.0 (0x00007f75240af000)
libxcb-present.so.0 => /usr/lib64/libxcb-present.so.0 (0x00007f7523eab000)
libxcb-sync.so.1 => /usr/lib64/libxcb-sync.so.1 (0x00007f7523ca5000)
libxshmfence.so.1 => /usr/lib64/libxshmfence.so.1 (0x00007f7523aa2000)
libXxf86vm.so.1 => /usr/lib64/libXxf86vm.so.1 (0x00007f752389b000)
libgraphite2.so.3 => /usr/lib64/libgraphite2.so.3 (0x00007f7523672000)
```
 
To Run environment just do the follow command
58,4 → 133,20
bash run.sh
```
 
Whit this simulation you can generate till 1000 data. This a sample used to proof viability using icarus verilog like a simulator whit mixed code. More information enter in contact with some propose.
###What I have done till now
 
- Graphical interface to a better experience
- Dinamic change clock during environment execution
- A set of baud rates i found across internet to test suit
- A output file in html format TX SystemC 2 RX Verilog contain data compared
 
### BUGS ? :-(
 
- Crashes when you change frequency with no specific baud rate
- Log in html data goes wrong after a reset
 
### What i will do on future if i still alive :-D
 
- Make output file in html format TX Verilog 2 RX SystemC contain data compared
- Found the reason 'real one' to crash simulation on change clock
- Make avaiable to user insert data during execution
/trunk/vpi/reset_uart.h
4,16 → 4,17
vpiHandle RESET = vpi_handle_by_name("module_tb.RESET", NULL);
vpiHandle RX = vpi_handle_by_name("module_tb.RX", NULL);
vpiHandle TX = vpi_handle_by_name("module_tb.TX", NULL);
vpiHandle WORK_FR = vpi_handle_by_name("module_tb.WORK_FR", NULL);
 
reset.format=vpiIntVal;
rx_value.format = vpiIntVal;
tx_value.format = vpiIntVal;
 
if(counter_reset < 5)
if(SC_UART->reset_set())
{
 
reset.value.integer = 1;
vpi_put_value(RESET, &reset, NULL, vpiNoDelay);
counter_reset = counter_reset + 1;
 
tx_value.value.integer = SC_UART->read_tx();
vpi_put_value(RX, &tx_value, NULL, vpiNoDelay);
20,12 → 21,18
 
vpi_get_value(TX, &rx_value);
SC_UART->write_rx(rx_value.value.integer);
 
reset.value.integer = SC_UART->get_baud_rate();
vpi_put_value(WORK_FR, &reset, NULL, vpiNoDelay);
//data.clear();
//parity.clear();
//SC_UART->clear_validation();
}
else
{
reset.value.integer = 0;
vpi_put_value(RESET, &reset, NULL, vpiNoDelay);
SC_UART->reset_set_low();
}
 
return 0;
/trunk/vpi/env_uart.cpp
1,4 → 1,4
#include "../iverilog/vpi_user.h"
#include <iverilog/vpi_user.h>
 
#include "../systemC/link_sc.h"
 
5,16 → 5,28
int counter;
int counter_reset;
 
unsigned int new_clock;
 
#include <stdio.h>
#include <iostream>
#include <dlfcn.h>
#include <random>
#include <vector>
#include<string.h>
 
unsigned int data_cnt=0;
 
using namespace std;
 
vector<unsigned int> data;
vector<unsigned int> parity;
 
 
void* lib_handle;
 
//typedef void (*ThreadSCRun_dl)();
//ThreadSCRun_dl ThreadSC;
 
Control_SC* (*create)();
void (*destroy)(Control_SC*);
 
30,19 → 42,18
s_vpi_value start_tx;
s_vpi_value ready_tx;
 
#include "execute_uart.h"
#include "run_sim.h"
#include "reset_uart.h"
#include "global_init.h"
#include "counter_global.h"
 
void Leitura_register()
void uart_test_suit_register()
{
s_vpi_systf_data tf_data;
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$execute_uart";
tf_data.calltf = execute_uart_calltf;
tf_data.tfname = "$run_sim";
tf_data.calltf = run_sim_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
57,14 → 68,6
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$global_counter";
tf_data.calltf = global_counter_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
77,7 → 80,7
}
 
void (*vlog_startup_routines[])() = {
Leitura_register,
uart_test_suit_register,
0
};
 
/trunk/vpi/global_init.h
11,10 → 11,9
rx_value.format = vpiIntVal;
tx_value.format = vpiIntVal;
 
reset.value.integer = 1;
vpi_put_value(RESET, &reset, NULL, vpiNoDelay);
reset.value.integer = 0;
vpi_put_value(START, &reset, NULL, vpiNoDelay);
vpi_put_value(RESET, &reset, NULL, vpiNoDelay);
counter = 0;
counter_reset = 0;
28,24 → 27,21
create = (Control_SC* (*)())dlsym(lib_handle, "create_object");
destroy = (void (*)(Control_SC*))dlsym(lib_handle, "destroy_object");
//ThreadSC = (ThreadSCRun_dl) dlsym(lib_handle, "ThreadSCRun");
SC_UART = (Control_SC*)create();
SC_UART->set_baud_rate(115200,50);
SC_UART->init();
SC_UART->set_period_clock_sc(20);
//SC_UART->set_baud_rate(115200,50);
//SC_UART->init();
//SC_UART->set_period_clock_sc(20);
 
reset.value.integer = SC_UART->get_baud_rate();
vpi_put_value(WORK_FR, &reset, NULL, vpiNoDelay);
 
SC_UART->reset_set_high();
 
tx_value.value.integer = SC_UART->read_tx();
vpi_put_value(RX, &tx_value, NULL, vpiNoDelay);
 
vpi_get_value(TX, &rx_value);
SC_UART->write_rx(rx_value.value.integer);
SC_UART->run_sim();
 
return 0;
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.