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; |
} |