Giter Club home page Giter Club logo

cores-veer-eh2's Introduction

VeeR EH2 RISC-V Core

This repository contains the VeeR EH2 RISC-V Core design RTL.

Overview

VeeR EH2 is a machine-mode (M-mode) only, 32-bit CPU core which supports RISC-V’s integer (I), compressed instruction (C), multiplication and division (M), atomic (A), and instruction-fetch fence, CSR, and subset of bit manipulation instructions (Zb*) extensions. The core is a 9-stage, dual-threaded, dual-issue, superscalar, mostly in-order pipeline with some out-of-order execution capability.

License

By contributing to this project, you agree that your contribution is governed by Apache-2.0.
Files under the tools directory may be available under a different license. Please review individual files for details.

Directory Structure

├── configs                 # Configurations Dir
├── design                  # Design root dir
│   ├── dbg                 #   Debugger
│   ├── dec                 #   Decode, Registers and Exceptions
│   ├── dmi                 #   DMI block
│   ├── exu                 #   EXU (ALU/MUL/DIV)
│   ├── ifu                 #   Fetch & Branch Prediction
│   ├── include             
│   ├── lib
│   └── lsu                 #   Load/Store
├── docs
├── tools                   # Scripts/Makefiles
└── testbench               # (Very) simple testbench
    ├── asm                 #   Example assembly files
    └── hex                 #   Canned demo hex files

Dependencies

  • Verilator (4.102 or later) must be installed on the system if running with Verilator
  • If adding/removing instructions, espresso must be installed (used by tools/coredecode)
  • A RISC-V tool chain (based on gcc version 7.3 or higher) must be installed so that it can be used to prepare RISC-V binaries to run.

Quickstart guide

  1. Clone the repository
  2. Setup RV_ROOT to point to the path in your local filesystem
  3. Determine your configuration {optional}
  4. Run make with tools/Makefile

Release Notes for this version

Please see release notes for changes and bug fixes in this version of VeeR.

Configurations

VeeR can be configured by running the $RV_ROOT/configs/veer.config script:

% $RV_ROOT/configs/veer.config -h for detailed help options

For example to build with a DCCM of size 64 Kb:

% $RV_ROOT/configs/veer.config -dccm_size=64

This will update the default snapshot in $PWD/snapshots/default/ with parameters for a 64K DCCM.

Add -snapshot=dccm64, for example, if you wish to name your build snapshot dccm64 and refer to it during the build.

There are 4 predefined target configurations: default, default_mt, typical_pd and high_perf that can be selected via the -target=name option to veer.config. See configs/README.md for a description of these targets.

Building an FPGA speed optimized model: Use -fpga_optimize=1 option to veer.config to build a model that removes clock gating logic from flop model so that the FPGA builds can run at higher speeds. This is now the default option for targets other than typical_pd.

Building a Power optimized model (ASIC flows): Use -fpga_optimize=0 option to veer.config to build a model that enables clock gating logic into the flop model so that the ASIC flows get a better power footprint. This is now the default option for target typical_pd.

This script derives the following consistent set of include files:

$PWD/snapshots/<snapshot_name>
├── common_defines.vh                       # `defines for testbench or design
├── defines.h                               # #defines for C/assembly headers
├── eh2_param.vh                            # Design parameters
├── eh2_pdef.vh                             # Parameter structure
├── pd_defines.vh                           # `defines for physical design
├── perl_configs.pl                         # Perl %configs hash for scripting
├── pic_map_auto.h                          # PIC memory map based on configure size
└── whisper.json                            # JSON file for veer-iss
└── link.ld                                 # default linker control file

Building a model

While in a work directory:

  1. Set the RV_ROOT environment variable to the root of the VeeR directory structure.

    Example for bash shell: export RV_ROOT=/path/to/veer Example for csh or its derivatives: setenv RV_ROOT /path/to/veer

  2. Create your specific configuration

    (Skip if default is sufficient)
    (Name your snapshot to distinguish it from the default. Without an explicit name, it will update/override the default snapshot)

    For example if mybuild is the name for the snapshot, set the BUILD_PATH environment variable:

    setenv BUILD_PATH snapshots/mybuild

    And then:

    $RV_ROOT/configs/veer.config [configuration options..] -snapshot=mybuild

    Snapshots are placed in the $BUILD_PATH directory

  3. Running a simple Hello World program (verilator)

    make -f $RV_ROOT/tools/Makefile target=default_mt

This command will build a verilator model of VeeR EH2 with AXI bus, and execute a short sequence of instructions that writes out "HELLO WORLD" to the bus.

The simulation produces output on the screen like:

VerilatorTB: Start of sim

-------------------------------
Hello World from VeeR EH2 hart0
-------------------------------
-------------------------------
Hello World from VeeR EH2 hart1
-------------------------------
TEST_PASSED

Finished hart0 : minstret = 1158, mcycle = 2895
Finished hart1 : minstret = 1733, mcycle = 2822
See "exec.log" for execution trace with register updates..

The simulation generates the following files:

  • console.log contains what the cpu writes to the console address of 0xd0580000.
  • exec.log shows instruction trace with GPR updates.
  • trace_port.csv contains a log of the trace port.

When debug=1 is provided, a vcd file sim.vcd is created and can be browsed by gtkwave or similar waveform viewers.

You can re-execute simulation using: ./obj_dir/Vtb_top or make -f $RV_ROOT/tools/Makefile verilator

The simulation run/build command has the following generic form:

make -f $RV_ROOT/tools/Makefile [<simulator>] [debug=1] [snapshot=<snap>] [target=<target>] [TEST=<test>] [TEST_DIR=<path_to_test_dir>][CONF_PARAMS=<conf_switches>]

where:

<simulator> - can be 'verilator' (by default) 'irun' - Cadence xrun, 'vcs' - Synopsys VCS, 'vlog' - Mentor Questa
              if not provided, 'make' cleans work directory, builds verilator executable and runs a test.
debug=1     - allows VCD generation for verilator and VCS and SHM waves for irun option.
<target>    - predefined CPU configurations 'default' ( by default), 'default_mt', 'typical_pd', 'high_perf' 
TEST        - allows to run a C (<test>.c) or assembly (<test>.s) test, hello_world is run by default 
TEST_DIR    - alternative to test source directory testbench/asm
<snap>      - run and build executable model of custom CPU configuration, remember to provide 'snapshot' argument 
              for runs on custom configurations.
CONF_PARAMS - allows to provide veer.config command line arguments like -set=dccm_size=32 or -unset=iccm_enable..

Example:

make -f $RV_ROOT/tools/Makefile verilator TEST=cmark

will simulate the testbench/asm/cmark.c program with Verilator on the default target

If you want to compile a test only, you can run:

make -f $RV_ROOT/tools/Makefile program.hex TEST=<test> [TEST_DIR=/path/to/dir]

The Makefile uses $RV_ROOT/testbench/linker.ld file by default to build the test executable.
The user can provide a test-specific linker file in <test_name>.ld to build the test executable, in the same directory with the test source.

The user also can create a test-specific Makefile in <test_name>.makefile, contaning building instructions how to create program.hex files used by simulation. The private Makefile should be in the same directory as the test source. (the program.hex file is loaded to instruction and data bus memory slaves and optionally to DCCM/ICCM at the beginning of simulation).

Note: You may need to delete the program.hex file from the work directory, before running a new test.

The $RV_ROOT/testbench/asm directory contains the following tests ready to simulate:

hello_world       - default tes to run, prints Hello World message to screen and console.log
hello_world_dccm  - the same as above, but takes the string from preloaded DCCM.
hello_world_iccm  - the same as hello_world, but loads ICCM via LSU-DMA bridge and then executes from ICCM
cmark             - coremark benchmark running with code and data in external memories
cmark_dccm        - the same as above, running data and stack from DCCM (faster)
cmark_iccm        - the same as above, but preloading and running from ICCM 
cmark_mt          - coremark benchmark running with code and data in external memories for MT configs
cmark_dccm_mt     - the same as above, running data and stack from DCCM (faster) for MT configs
cmark_iccm_mt     - the same as above, but preloading and running from ICCM for MT configs
dhry              - dhrystone benchmark as example of multisouce program from testbench/tests/dhry directory
dhry_mt           - similar to above, but running two harts ( need to be run on MT configs )

The $RV_ROOT/testbench/hex directory contains precompiled hex files of the tests, ready for simulation in case RISC-V SW tools are not installed.

Note: The testbench has a simple synthesizable bridge that allows you to load the ICCM via load/store instructions. This is only supported for AXI4 builds.

cores-veer-eh2's People

Contributors

danielmlynek avatar jrahmeh avatar kgugala avatar tmw-wdc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cores-veer-eh2's Issues

RISCV compliance test suit partly fails

Hi,

I am currently trying to run the RISCV compliance tests in https://github.com/riscv/riscv-compliance on the EH2 core using a tool named Riscof (https://github.com/riscv-software-src/riscof). When applying the full ISA I find that some tests are failing:

image

In chapter 18 in revision 1.4 of the EH2 Programmer's Reference Manual a list of expected failing compliance test suites (from the above repository) is given. The same discussion seems to be had in chipsalliance/Cores-VeeR-EH1#33 for EH1.

The links in the reference manual seems to be outdated, but the test names suggest that it is the same group of tests that are failing. Section "18.3 I-FENCE.I-01 and fence_i" may reference the same test as "/root/work/eh2/riscv-arch-test/riscv-test-suite/rv32i_m/Zifencei/src/Fencei.S". Likewise does section "18.1 I-MISALIGN_LDST-01" and "18.2 I-MISALIGN_JMP-01" seem to be included in the group of failing tests named "/root/work/eh2/riscv-arch-test/riscv-test-suite/rv32i_m/privilege/src/misalign-(...)".

Are these test cases in fact expected to fail?

Thanks and Happy new year! :)

Regards
Don-Haugaard

AHB-Lite support

the EN2 RTL code already include AHB-lite ports, why doc metioned that it is not support ?

Adding FPU with EH2

Hi @jrahmeh,
I am trying to add a floating point unit with EH2 as a out of pipe just like division is implemented. Just want to have some guidance or points to keep in mind.
I have generated the equations for for Single Precision i.e "F-extension" and now following the implemented of DIV unit to replicate that for FPU.
Thanks,

Verilator build is erroring out

I ran this on a clean checkout:
make -f $RV_ROOT/tools/Makefile target=default_mt debug=1

I am getting the following error:
VerilatorTB: Start of sim

terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
/home/user/swerv_eh2/Cores-SweRV-EH2/tools/Makefile:113: recipe for target 'verilator' failed
make: *** [verilator] Aborted (core dumped)

unused csr_perfv{a to i} in decoder

Hi,
I notice that in csrdecode file the .definition has CSR Address Map number for csr_perfva to csr_perfvi. However it is not used in .decode.
I think the csr_decoder file should be cleanedup by removing csr_perfva to csr_perfvi or it should be

csr[ csr_perfva    ] = { csr_perfva valid_only }
csr[ csr_perfvb    ] = { csr_perfvb valid_only }
csr[ csr_perfvc    ] = { csr_perfvc valid_only }
csr[ csr_perfve    ] = { csr_perfve valid_only }
csr[ csr_perfvf    ] = { csr_perfvf valid_only }
csr[ csr_perfvg    ] = { csr_perfvg valid_only }
csr[ csr_perfvh    ] = { csr_perfvh valid_only }
csr[ csr_perfvi    ] = { csr_perfvi valid_only }

I can also see the generated systemverilog file does not have any code related to csr_perfv{a to f}.

Hardware Accelerator and its interface.

Is there any hardware accelerator and interface for SweRV32-EH2, if yes please let me know.
Or is there any hardware optimization available in the core for AI/ML?
I had posted this question in Core-WG but no one is there to respond me back.

understanding store_databypass_c1 and c2

Hi,
I am trying to understand how store_data_bypass_c1 and store_data_bypass_c2 signal helps in forwarding data.
I took a simple RAW hazard scenario as below and only one thread is executing this in order.

  lw X13, 23(X10);
  sw X13, 32(X11);

when the sw instruction is in decode stage the store_data_bypass_c2 should become high.
the LSU dc1 to dc3 stages for the two instruction should be like

LW LW LW
   SW SW

and from the code of lsu I can understand that when sw instruction is executed in lsu, store_data_dc2 gets overwritten with lsu_result_dc3 data. which is basically forwarding lw data

but this is a best case scenario since the previous lw instruction should have obtained data in dc3 either through lsu_buffer or from a forwarding logic.

My question here is if the previous lw data was not in buffer, it should take 5 or 6 CC to get data from the main memory, then this sw instruction should be stalled for few cycles, but i don't think this stall happens or there is some other way the core takes care of this situation.

it would be great if someone can help me fill my missing piece of insight.

Add cmark.hex

Please provide allowing running the cmark test without requiring the tool chain.

I suggest someone build cmark's hex files, and commit them under testbench/cmark.hex/program.hex and testbench/cmark.hex/data.hex.

We can then run with "make .... TEST=cmark.hex"

Which is the new pull #1 syntax. Thanks

Can't execute "coredecode -in decode > coredecode.e"

// file "decode" is human readable file that has all of the instruction decodes defined and is part of git repo
// modify this file as needed

// to generate all the equations below from "decode" except legal equation:

// 1) coredecode -in decode > coredecode.e

// 2) espresso -Dso -oeqntott coredecode.e | addassign -pre out. > equations

I just read the annotation, but the "coredecode -in decode > coredecode.e" is a commandLIne or something? I cant execute it, should i install some packages for serving these?
thank.

doubt in ld_full_hit_lo/hi_dc2

Hi,
I have doubt in the below code of load forwarding logic
https://github.com/chipsalliance/Cores-SweRV-EH2/blob/a95fdb81ea6dc19239cfe2953ef00710a6f1cf2a/design/lsu/eh2_lsu_bus_intf.sv#L404-L411

I am quite not sure why inverse of ldst_byteen_lo/hi_dc2 is in OR with ld_byte_hit_lo/hi

if the byte location of dc2 data request matches with the byte location of the element in the buffer or sw instr in pipe then ld_byte_hit_lo/hi signal becomes high which is enough to determine a load full hit.

why | ~ldst_byteen_lo_dc2[i] , | ~ldst_byteen_hi_dc2[i] ?

Working of Non-Blocking Loads

Hi,
When I run hello world assembly code, I notice that STDOUT data moves out of LSU through non-blocking loads.

I would like to know how the core decides that it can move the data through non-blocking load ports

I was unable to get much information about non-blocking loads from PRM, the PRM I think just has registers that can point out during non-blocking load bus errors.

        79 :      #20 0 00000042 00010217  tp=00010042 ; auipc   tp,0x10000
        80 :      #21 0 00000046 fbe20213  tp=00010000 ; addi    tp,tp,-66
        80 :      #22 0 0000004a 0000a821              ; c.j     0x62
        85 :      #23 0 00000062 00020283              ; lb      t0,0(tp) [00010000]
        87 :          0                    t0=0000002d ; nbL       <--------------------------------- Here
        93 :      #24 0 00000066 00518023              ; sb      t0,0(gp) [d0580000]
        93 :      #25 0 0000006a 00000205  tp=00010001 ; c.addi  tp,1
        94 :      #26 0 0000006c fe029be3              ; bne     t0,zero,0x62
        99 :      #27 0 00000062 00020283              ; lb      t0,0(tp) [00010001]
       101 :          0                    t0=0000002d ; nbL       <--------------------------------- Here
       107 :      #28 0 00000066 00518023              ; sb      t0,0(gp) [d0580000]

Thanks

how to modify the tb file

The current tb file is a single instruction for simulation, and there will be 7 cycles between instructions. I would like to know how to modify the tb file so that the instructions can be simulated in a pipeline, can you help me?

meaning of lus_p.pipe and lsu.stack

Hi,
i was thinking that .pipe conveys that the lsu packet is in pipeline, but I was wrong after seeing this line of code.
https://github.com/chipsalliance/Cores-SweRV-EH2/blob/a95fdb81ea6dc19239cfe2953ef00710a6f1cf2a/design/dec/eh2_dec_decode_ctl.sv#L1385

I am not sure why lsu_p.pipe is inverse of i0_dp.lsu. I also notice that i1_dp.lsu has no affect on this signal. I can see the lsu_p.pipe is used for flushing dc5 in lsu. But i haven't explored the tlu logics, so any insight about this signal would be really helpful

i also think lsu_p.stack is not used, but let me know if i am missing something

Hex files for dhry tests are not updated after related source files changes

Commit 12fca60 have introduce changes in dhry related source files while dhry.hex and dhry_mt.hex was not updated (rebuild).
Now when using hex files from repo both dhry and dhry_mt test passes, while when building hex via toolchain then both those tests hangs.
Additionally dhry test prints assertions:
assertion "Balloc succeeded" failed: file "/build/riscv-gnu-toolchain/riscv-newlib/newlib/libc/stdlib/ldtoa.c", line 2926

range vs region

Hi,
I am slightly confused with rangecheck module. If a address falls in the range , then it automatically means that it is in side the region right ?

LSU bus buffer code

In the LSU code for bus buffer (eh2_lsu_bus_buffer.sv), line 465, is there a typo where lsu_addr_dc5 is used instead of end_addr_dc5?

dhry_mt benchmark failed

Hi all,
I cannot successfully run dhry_mt program-- it always times out. But if I remark the last few 'printf' related to
floating point calculations(on performance numbers), the progarm can be successfully completed. But strange
enough, the cmark program can be successfully completed in spite of its having floating point calculations.

Does anyone have any ideas on this? My enviroment is : verilator 4.227, riscv toolchain compiled based on gcc 10.2.0
The command issued is: make -f $RV_ROOT/tools/Makefile verilator target=default_mt TEST=dhry_mt

Importance of ldst_dual signals

Hi,
I would like to know the use of ldst_dual_dc1,2,3,4 signals. I find from the comment that it is for "load/store is unaligned at 32 bit boundary". However I quiet don't get the actual use of it.

I can see from the code that the 3rd bit of start and end address is compared but it would be great if someone can give a short description about it.

https://github.com/chipsalliance/Cores-SweRV-EH2/blob/a95fdb81ea6dc19239cfe2953ef00710a6f1cf2a/design/lsu/eh2_lsu.sv#L343-L347

btw what is the full form of dc, is it "data commit" ?

I would also like to know what "cam" means in eh2_dec_cam , "tlu" in dec_tlu_debug_halted

understanding of axi_lsu_dma_bridge

Hi,
I notice that the module axi_lsu_dma_bridge in testbench has one master (lsu) and two slaves ( s0 - main memory, s1 - dma).
When I looked into the code I observed that when the master provided address falls into iccm address range, the bridge directs the request to dma slave.

right now the TB directly dumps the data into dccm, iccm. but in real case scenario with the use of lw, sw instructions pointing to dccm address it is possible to write/read data from dccm.

However, to write data into iccm, the data should be moved through lsu and is written in iccm through dma using this bridge right ?
in case of read to iccm, the lsu read request is sent to dma slave , the dma slave will fetch data from iccm and give it to lsu right ?

In short, can i say that this bridge is used for reading/writing iccm ?

let me know if my understanding is write / wrong 😃

AXI Assertion Bug

Hi,
I notice that one of the AXI assertion in eh2_lsu_bus_intf is wrong. For the read address channel, lsu_axi_arvalid should be high for the assertion to trigger instead it is lsu_axi_awvalid .
The contents in $display should also be changed to lsu_axi_arvalid=1'b%b, lsu_axi_arsize=3'h%h instead of lsu_axi_awvalid=1'b%b, lsu_axi_awsize=3'h%h.

https://github.com/chipsalliance/Cores-SweRV-EH2/blob/a95fdb81ea6dc19239cfe2953ef00710a6f1cf2a/design/lsu/eh2_lsu_bus_intf.sv#L638-L646

let me know if my understanding is wrong :)

No improvement for Statistics

Hi, I am currently trying to improve upon the base statistics generated when running the Coremark example.
I am running with the following command
` make -f $RV_ROOT/tools/Makefile $@ target=default TEST=cmark'

Where the $@ is a number of CONF_PARAM=-set=... commands that I have being set from another file. These params include changing the icache_size and dccm_size, basically all variables provided in order to try to change the coremark return values at all. So far though it seems as if there has been no change at all, is there another step that I am missing? I have not installed espresso, is this necessary?

VerilatorTB problem

when i run this command:
make -f $RV_ROOT/tools/Makefile target=default_mt

only get:
VerilatorTB: Start of sim

----------------------------------------
Hello World from SweRV EH2 hart0 @WDC !!
----------------------------------------
TEST_PASSED

Finished hart0 : minstret = 524, mcycle = 1492
Finished hart1 : minstret = 1227, mcycle = 1424
See "exec.log" for execution trace with register updates..

- /home/lyj/Cores-SweRV-EH2-master/testbench/tb_top.sv:337: Verilog $finish

VerilatorTB: End of sim

but not get:

VerilatorTB: Start of sim

----------------------------------------
Hello World from SweRV EH2 hart0 @WDC !!
----------------------------------------
----------------------------------------
Hello World from SweRV EH2 hart1 @WDC !!
----------------------------------------
TEST_PASSED

Finished hart0 : minstret = 1158, mcycle = 2895
Finished hart1 : minstret = 1733, mcycle = 2822
See "exec.log" for execution trace with register updates..

the system run out when exec to this line:
4f88082c7edfa039359002404923c64

understanding I-Cache

Hi,
I am trying to understand the RTL that generates the I-Cache. I am currently running the default configuration that makes the core run on single thread.
I find the parameters in eh2_param.vh as

ICACHE_BANKS_WAY       : 7'h02        
ICACHE_NUM_WAYS        : 7'h04    

based on this I am interpreting it as two-way set associative cache as BANKS means Blocks and NUM_WAYS means Number_of_Sets in a cache
I am focusing only on the Packed I-Cache and ECC enabled, However I am confused with this line of code
https://github.com/chipsalliance/Cores-SweRV-EH2/blob/a95fdb81ea6dc19239cfe2953ef00710a6f1cf2a/design/ifu/eh2_ifu_ic_mem.sv#L705-L711
because the cache data should be only in one of the bank, but here I find both the banks data merged into a array and is later used

please let me know if my understanding is wrong or if you need few more details about my doubt

PreSync/PostSync in CSR Registers

Hi,
Can someone tell the difference between presync/postsync in CSR registers ? . why such synchronization is required ?. At a very high level, I can see these pre/post sync introduce stalls in pipe and the stall remains active until the pipeline is empty. But I can't figure out the difference between the them.

Thanks

ICCM read issue

version 1.4
ICCM base address: 0x1004_0000
When I try to read the ICCM. I find the CPU get the data from LSU-DMA path but not CPU's internal path. Is it right?
iccm_rden is asserted but later than lsu_axi_arvalid. The iccm_rd_data is not used by the CPU.
If s1_rdata(tb_top.sv) tie to 64'hf, the CPU will get the 64'hf.
image

build error with target=high_perf

I got error messages as below when running simulation with target=high_perf.
default target has no problem but high_perf target has the problem.
Please help me.

[config & simualtion]
configs/swerv.config -target=high_perf
make -f tools/Makefile verilator target=high_perf

[simulation log]
BUILD_PATH=snapshots/high_perf /home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/configs/swerv.config -target=high_perf

SweRV configuration for target=high_perf

swerv: no_secondary_alu = 0
swerv: load_to_use_bus_plus1 = 1
swerv: lsu_stbuf_depth = 10
swerv: dma_buf_depth = 5
swerv: verilator =
swerv: load_to_use_plus1 = 0
swerv: opensource = 0
swerv: lsu_num_nbload = 8
swerv: fast_interrupt_redirect = 1
swerv: fpga_optimize = 0
swerv: timer_legal_en = 1
swerv: num_threads = 2
swerv: dccm_num_banks = 8
swerv: dccm_enable = 1
swerv: dccm_region = 0xf
swerv: dccm_offset = 0x40000
swerv: dccm_size = 128
swerv: bht_addr_lo = 3
swerv: bht_size = 4096
swerv: inst_access_addr5 = 0x00000000
swerv: data_access_mask6 = 0xffffffff
swerv: data_access_enable7 = 0x0
swerv: data_access_addr1 = 0x00000000
swerv: inst_access_enable4 = 0x0
swerv: data_access_mask3 = 0xffffffff
swerv: inst_access_mask3 = 0xffffffff
swerv: data_access_mask4 = 0xffffffff
swerv: data_access_mask0 = 0xffffffff
swerv: data_access_enable3 = 0x0
swerv: inst_access_enable3 = 0x0
swerv: inst_access_mask7 = 0xffffffff
swerv: inst_access_addr4 = 0x00000000
swerv: inst_access_addr1 = 0x00000000
swerv: inst_access_mask5 = 0xffffffff
swerv: inst_access_mask2 = 0xffffffff
swerv: data_access_enable2 = 0x0
swerv: data_access_addr7 = 0x00000000
swerv: data_access_addr3 = 0x00000000
swerv: data_access_enable0 = 0x0
swerv: inst_access_enable1 = 0x0
swerv: data_access_enable4 = 0x0
swerv: inst_access_enable6 = 0x0
swerv: data_access_enable1 = 0x0
swerv: inst_access_mask1 = 0xffffffff
swerv: inst_access_addr6 = 0x00000000
swerv: data_access_mask2 = 0xffffffff
swerv: data_access_addr6 = 0x00000000
swerv: inst_access_enable7 = 0x0
swerv: inst_access_addr7 = 0x00000000
swerv: data_access_addr2 = 0x00000000
swerv: data_access_addr0 = 0x00000000
swerv: inst_access_enable0 = 0x0
swerv: data_access_addr5 = 0x00000000
swerv: data_access_mask7 = 0xffffffff
swerv: inst_access_addr3 = 0x00000000
swerv: data_access_mask5 = 0xffffffff
swerv: inst_access_enable5 = 0x0
swerv: data_access_addr4 = 0x00000000
swerv: inst_access_mask0 = 0xffffffff
swerv: data_access_enable6 = 0x0
swerv: data_access_mask1 = 0xffffffff
swerv: inst_access_addr0 = 0x00000000
swerv: inst_access_addr2 = 0x00000000
swerv: data_access_enable5 = 0x0
swerv: inst_access_mask6 = 0xffffffff
swerv: inst_access_mask4 = 0xffffffff
swerv: inst_access_enable2 = 0x0
swerv: ifu_bus_id = 1
swerv: dma_bus_prty = 2
swerv: sb_bus_tag = 1
swerv: dma_bus_id = 1
swerv: lsu_bus_tag = 4
swerv: bus_prty_default = 3
swerv: ifu_bus_tag = 4
swerv: ifu_bus_prty = 2
swerv: lsu_bus_prty = 2
swerv: sb_bus_prty = 2
swerv: sb_bus_id = 1
swerv: lsu_bus_id = 1
swerv: dma_bus_tag = 1
swerv: btb_index1_lo = 3
swerv: btb_addr_lo = 3
swerv: btb_size = 512
swerv: pic_region = 0xf
swerv: pic_meigwctrl_offset = 0x4000
swerv: pic_meip_count = 4
swerv: pic_mpiccfg_offset = 0x3000
swerv: pic_meipt_count = 127
swerv: pic_meip_mask = 0x0
swerv: pic_meipl_offset = 0x0000
swerv: pic_meitp_offset = 0x1800
swerv: pic_meigwclr_offset = 0x5000
swerv: pic_meidels_count = 127
swerv: pic_size = 32
swerv: pic_meie_count = 127
swerv: pic_meidels_offset = 0x6000
swerv: pic_meipl_count = 127
swerv: pic_total_int = 127
swerv: pic_meitp_mask = 0x0
swerv: pic_offset = 0xc0000
swerv: pic_mpiccfg_mask = 0x1
swerv: pic_meitp_count = 127
swerv: pic_meigwctrl_mask = 0x3
swerv: pic_2cycle = 1
swerv: pic_meipt_offset = 0x3004
swerv: pic_meipt_mask = 0x0
swerv: pic_meidels_mask = 0x1
swerv: pic_meie_offset = 0x2000
swerv: pic_meip_offset = 0x1000
swerv: pic_meigwctrl_count = 127
swerv: pic_meigwclr_count = 127
swerv: pic_meigwclr_mask = 0x0
swerv: pic_meipl_mask = 0xf
swerv: pic_mpiccfg_count = 1
swerv: pic_meie_mask = 0x1
swerv: ret_stack_size = 4
swerv: icache_banks_way = 2
swerv: icache_size = 32
swerv: icache_bank_width = 8
swerv: icache_2banks = 1
swerv: icache_ln_sz = 64
swerv: icache_ecc = 1
swerv: icache_waypack = 0
swerv: icache_enable = 1
swerv: icache_num_ways = 4
swerv: iccm_enable = 1
swerv: iccm_region = 0xe
swerv: iccm_offset = 0xe000000
swerv: iccm_size = 64
swerv: iccm_num_banks = 4
swerv: Writing snapshots/high_perf/eh2_pdef.vh
swerv: Writing snapshots/high_perf/eh2_param.vh
swerv: Writing snapshots/high_perf/common_defines.vh
swerv: Writing snapshots/high_perf/defines.h
swerv: Writing snapshots/high_perf/pd_defines.vh
swerv: Writing snapshots/high_perf/whisper.json
swerv: Writing snapshots/high_perf/perl_configs.pl
riscv64-unknown-elf-cpp -Isnapshots/high_perf /home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/testbench/asm/hello_world.s > hello_world.cpp.s
riscv64-unknown-elf-as -march=rv32gc hello_world.cpp.s -o hello_world.o
Building hello_world
riscv64-unknown-elf-ld -m elf32lriscv --discard-none -T/home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/testbench/link.ld -o hello_world.exe hello_world.o
riscv64-unknown-elf-objcopy -O verilog --only-section ".data*" --change-section-lma .data*-0x10000 hello_world.exe data.hex
riscv64-unknown-elf-objcopy -O verilog --only-section ".text*" hello_world.exe program.hex
riscv64-unknown-elf-objdump -S hello_world.exe > hello_world.dis
riscv64-unknown-elf-nm -f posix -C hello_world.exe > hello_world.tbl
Completed building hello_world
echo '`undef ASSERT_ON' >> snapshots/high_perf/common_defines.vh
verilator '-UASSERT_ON' --cc -CFLAGS "-std=c++11" snapshots/high_perf/common_defines.vh /home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/design/include/eh2_def.sv snapshots/high_perf/eh2_pdef.vh
-Isnapshots/high_perf -I/home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/testbench -f /home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/testbench/flist
-Wno-WIDTH -Wno-UNOPTFLAT /home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/testbench/tb_top.sv /home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/testbench/ahb_sif.sv --top-module tb_top
-exe test_tb_top.cpp --autoflush
cp /home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/testbench/test_tb_top.cpp obj_dir/
make -C obj_dir/ -f Vtb_top.mk OPT_FAST="-O2"
make[1]: directory '/home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/obj_dir' enter
g++ -I. -MMD -I/usr/local/share/verilator/include -I/usr/local/share/verilator/include/vltstd -DVM_COVERAGE=0 -DVM_SC=0 -DVM_TRACE=0 -faligned-new -Wno-bool-operation -Wno-sign-compare -Wno-uninitialized -Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable -Wno-shadow -std=c++11 -O2 -c -o test_tb_top.o test_tb_top.cpp
/usr/bin/perl /usr/local/share/verilator/bin/verilator_includer -DVL_INCLUDE_OPT=include Vtb_top.cpp Vtb_top___024unit.cpp Vtb_top_eh2_ifu_aln_ctl__pi15.cpp Vtb_top_eh2_dec_gpr_ctl__pi18.cpp Vtb_top_eh2_ifu_mem_ctl_thr__pi38.cpp Vtb_top_eh2_dec_cam__pi39.cpp Vtb_top_eh2_dec_tlu_ctl__pi40.cpp Vtb_top_eh2_lsu_bus_buffer__pi42.cpp > Vtb_top__ALLfast.cpp
g++ -I. -MMD -I/usr/local/share/verilator/include -I/usr/local/share/verilator/include/vltstd -DVM_COVERAGE=0 -DVM_SC=0 -DVM_TRACE=0 -faligned-new -Wno-bool-operation -Wno-sign-compare -Wno-uninitialized -Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable -Wno-shadow -std=c++11 -O2 -c -o Vtb_top__ALLfast.o Vtb_top__ALLfast.cpp
g++: internal compiler error: killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See file:///usr/share/doc/gcc-7/README.Bugs for instructions.
/usr/local/share/verilator/include/verilated.mk:206: recipe for target 'Vtb_top__ALLfast.o' failed
make[1]: *** [Vtb_top__ALLfast.o] Error 4
make[1]: directory '/home/kdlee/work/riscv/chipsalliance/swerv_eh2/Cores-SweRV-EH2/obj_dir' exit
tools/Makefile:86: recipe for target 'verilator-build' failed
make: *** [verilator-build] Error 2

ICCM Only Mode (How does ICCM talks to External Memory)

ICCM is in the core complex so in the ICCM Only Mode how are the instruction are loaded into ICCM from the External Memory.
In the test bench there is a task which pre-loads the ICCM, there are few issues with that

  1. The first address in the PC is always zero so you never read the instruction from the ICCM.
  2. As the address checking range from ICCM always failed so the instruction is always read from the External Memory.
  3. Is there is any connectivity between the ICCM and the External Memory to load instruction from External Memory to ICCM?

[Question] AXI4-ectomy

If I wanted to try removing the AXI4 bus interface and replace it with a different bus interface, would modifying eh2_ifu_mem_ctl and eh2_lsu_bus_intf be sufficient? I'm still tracing the code where .* is used, but I figure it should be possible to swap the cache's memory interface.

Core Design validation/verification

Hello
I see in the documentation that this core has been validated to compliance with RISC-V spec.
But it is not stated to what level the core is checked.
Is it a simple compliance check, validation, or a full verification?

I want to make an addition to the core, but in doing so, I want to make sure that I don't break the execution of the core in any way.
How would I do this the best way?
I have looked at several tools for validation, RISCOF being the latest one. Will I be able to use it for validation of this design?

Cores-SweRV-EH2 Lint error

I use the VC static tools to check the code, and find the following Error.
Code version 1.4

Tag : UndrivenInTerm-ML
Description : Detected undriven input terminal [DesignObjSignal]
Violation : Lint:60
Goal : lint_rtl
Module : eh2_pic_ctrl
FileName : /ip/eh2/eh2_pic_ctrl.sv
LineNumber : 654
Statement : assign picm_rd_data_in[31:0] = ({32{intpend_reg_read }} & intpend_rd_out ) |
DesignObjSignal : x_ecuss/rvtop/swerv/pic_ctrl_inst/mask[3:0]
String1 :

W123 (17 errors/0 waived)

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:760
Goal : lint_rtl
Module : eh2_ifu_mem_ctl_thr
FileName : /ip/eh2/ifu/eh2_ifu_mem_ctl.sv
LineNumber : 2111
Statement : assign ic_byp_data_only_pre_new[79:0] = ({80{~ifu_fetch_addr_int_f2[2] & ~mb_idle}} & {ic_miss_buff_data[byp_fetch_index_inc_0][15:0],ic_miss_buff_data[byp_fetch_index_1][31:0] , ic_miss_buff_data[byp_fetch_index_0][31:0]}) |
VariableName : byp_fetch_index_inc_1
ExprSize :
HIERARCHY : rvtop/swerv/ifu/mem_ctl/THREADS[0].ifu_mem_ctl_thr_inst

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:759
Goal : lint_rtl
Module : eh2_ifu_mem_ctl_thr
FileName : /ip/eh2/ifu/eh2_ifu_mem_ctl.sv
LineNumber : 2111
Statement : assign ic_byp_data_only_pre_new[79:0] = ({80{~ifu_fetch_addr_int_f2[2] & ~mb_idle}} & {ic_miss_buff_data[byp_fetch_index_inc_0][15:0],ic_miss_buff_data[byp_fetch_index_1][31:0] , ic_miss_buff_data[byp_fetch_index_0][31:0]}) |
VariableName : byp_fetch_index_inc_0
ExprSize :
HIERARCHY : rvtop/swerv/ifu/mem_ctl/THREADS[0].ifu_mem_ctl_thr_inst

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:667
Goal : lint_rtl
Module : eh2_ifu_bp_ctl
FileName : /ip/eh2/ifu/eh2_ifu_bp_ctl.sv
LineNumber : 1710
Statement : wire[3:0] wr_sel = {
VariableName : bht_wr_addr1
ExprSize :
HIERARCHY : rvtop/swerv/ifu/bp

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:757
Goal : lint_rtl
Module : eh2_ifu_mem_ctl_thr
FileName : /ip/eh2/ifu/eh2_ifu_mem_ctl.sv
LineNumber : 2111
Statement : assign ic_byp_data_only_pre_new[79:0] = ({80{~ifu_fetch_addr_int_f2[2] & ~mb_idle}} & {ic_miss_buff_data[byp_fetch_index_inc_0][15:0],ic_miss_buff_data[byp_fetch_index_1][31:0] , ic_miss_buff_data[byp_fetch_index_0][31:0]}) |
VariableName : byp_fetch_index_0
ExprSize :
HIERARCHY : rvtop/swerv/ifu/mem_ctl/THREADS[0].ifu_mem_ctl_thr_inst

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:669
Goal : lint_rtl
Module : eh2_ifu_bp_ctl
FileName : /ip/eh2/ifu/eh2_ifu_bp_ctl.sv
LineNumber : 1710
Statement : wire[3:0] wr_sel = {
VariableName : bht_wr_addr3
ExprSize :
HIERARCHY : rvtop/swerv/ifu/bp

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:658
Goal : lint_rtl
Module : eh2_ifu
FileName : /ip/eh2/ifu/eh2_ifu.sv
LineNumber : 590
Statement : assign ifu_i1_bp_index [pt.NUM_THREADS-1:0] = i1_bp_index[pt.NUM_THREADS-1:0];
VariableName : i1_bp_index
ExprSize : (1 bits)
HIERARCHY : rvtop/swerv/ifu

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:660
Goal : lint_rtl
Module : eh2_ifu
FileName : /ip/eh2/ifu/eh2_ifu.sv
LineNumber : 586
Statement : assign ifu_i0_bp_index [pt.NUM_THREADS-1:0] = i0_bp_index[pt.NUM_THREADS-1:0];
VariableName : i0_bp_index
ExprSize : (1 bits)
HIERARCHY : rvtop/swerv/ifu

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:1016
Goal : lint_rtl
Module : eh2_dec_csr
FileName : /ip/eh2/dec/eh2_dec_csr.sv
LineNumber : 607
Statement : assign tlu_csr_pkt_d.valid_only = valid_only;
VariableName : valid_only
ExprSize :
HIERARCHY : rvtop/swerv/dec/tlu/i0_csr_decoder

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:2017
Goal : lint_rtl
Module : eh2_pic_ctrl
FileName : /ip/eh2/eh2_pic_ctrl.sv
LineNumber : 654
Statement : assign picm_rd_data_in[31:0] = ({32{intpend_reg_read }} & intpend_rd_out ) |
VariableName : mask[3:0]
ExprSize :
HIERARCHY : rvtop/swerv/pic_ctrl_inst

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:779
Goal : lint_rtl
Module : eh2_ifu_aln_ctl
FileName : /ip/eh2/ifu/eh2_ifu_aln_ctl.sv
LineNumber : 1061
Statement : assign i1_bp_index[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = (i1_shift) ? i1_bpindex : '0;
VariableName : i1_bpindex
ExprSize :
HIERARCHY : rvtop/swerv/ifu/aln[0].aln

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:778
Goal : lint_rtl
Module : eh2_ifu_aln_ctl
FileName : /ip/eh2/ifu/eh2_ifu_aln_ctl.sv
LineNumber : 1056
Statement : assign i0_bp_index[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = (i0_shift) ? i0_bpindex : '0;
VariableName : i0_bpindex
ExprSize :
HIERARCHY : rvtop/swerv/ifu/aln[0].aln

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:2166
Goal : lint_rtl
Module : eh2_ifu_iccm_mem
FileName : /ip/eh2/ifu/eh2_ifu_iccm_mem.sv
LineNumber : 667
Statement : assign iccm_rd_data_pre[95:0] = {iccm_bank_dout_fn[iccm_rd_addr_hi_q][31:0], iccm_bank_dout_fn[iccm_rd_addr_md_q][31:0], iccm_bank_dout_fn[iccm_rd_addr_lo_q[pt.ICCM_BANK_HI:2]][31:0]};
VariableName : iccm_rd_addr_md_q
ExprSize :
HIERARCHY : rvtop/mem/iccm.iccm

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:668
Goal : lint_rtl
Module : eh2_ifu_bp_ctl
FileName : /ip/eh2/ifu/eh2_ifu_bp_ctl.sv
LineNumber : 1710
Statement : wire[3:0] wr_sel = {
VariableName : bht_wr_addr2
ExprSize :
HIERARCHY : rvtop/swerv/ifu/bp

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:666
Goal : lint_rtl
Module : eh2_ifu_bp_ctl
FileName : /ip/eh2/ifu/eh2_ifu_bp_ctl.sv
LineNumber : 1710
Statement : wire[3:0] wr_sel = {
VariableName : bht_wr_addr0
ExprSize :
HIERARCHY : rvtop/swerv/ifu/bp

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:2077
Goal : lint_rtl
Module : EH2_IC_TAG
FileName : /ip/eh2/ifu/eh2_ifu_ic_mem.sv
LineNumber : 1373
Statement : `EH2_IC_TAG_PACKED_SRAM(64,104)
VariableName : ic_rw_addr_q
ExprSize :
HIERARCHY : rvtop/mem/icache.icm/ic_tag_inst

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:2165
Goal : lint_rtl
Module : eh2_ifu_iccm_mem
FileName : /ip/eh2/ifu/eh2_ifu_iccm_mem.sv
LineNumber : 667
Statement : assign iccm_rd_data_pre[95:0] = {iccm_bank_dout_fn[iccm_rd_addr_hi_q][31:0], iccm_bank_dout_fn[iccm_rd_addr_md_q][31:0], iccm_bank_dout_fn[iccm_rd_addr_lo_q[pt.ICCM_BANK_HI:2]][31:0]};
VariableName : iccm_rd_addr_hi_q
ExprSize :
HIERARCHY : rvtop/mem/iccm.iccm

Tag : W123
Description : Variable '[VariableName]'[ExprSize] read but never set.[Hierarchy: '[HIERARCHY]']
Violation : Lint:758
Goal : lint_rtl
Module : eh2_ifu_mem_ctl_thr
FileName : /ip/eh2/ifu/eh2_ifu_mem_ctl.sv
LineNumber : 2111
Statement : assign ic_byp_data_only_pre_new[79:0] = ({80{~ifu_fetch_addr_int_f2[2] & ~mb_idle}} & {ic_miss_buff_data[byp_fetch_index_inc_0][15:0],ic_miss_buff_data[byp_fetch_index_1][31:0] , ic_miss_buff_data[byp_fetch_index_0][31:0]}) |
VariableName : byp_fetch_index_1
ExprSize :
HIERARCHY : rvtop/swerv/ifu/mem_ctl/THREADS[0].ifu_mem_ctl_thr_inst

Repeated entry interrupt

Hi,
When I trigger PIC interrupt,the value of mcause register is 0x2 and mepc register is 0x0. I found that the general register x1 has return address and then assigned it to mepc. Sometimes interruptions can end smoothly, Sometimes after exiting interrupt, it will enter the interrupt handler again, and x1 is 0. Of course, I have cleared the interrupt source.
Please give me some suggestions on this issue.

Thanks

Part signals of DMA have not load.

We find these signal don't have load: dma_axi_awlen dma_axi_awburst, dma_axi_arlen dma_axi_arburst, in the eh2_swerv.sv
Can you explain it?
And in the Reference Manual , dma_axi_awburst and dma_axi_arburst's description is simple, What mode does it support?

multi thread cache miss question

Hi, I am studying how EH2 handle cache miss, and i encountered a problem about the miss state machine. How does the DUPL_MISS_WAIT state work?

What I currently understand is :
When thread 1 miss on an index on which thread 0 is currently handling an elder miss, thread 1 use this state to lock its miss handler. Thread 1 will release the lock, refetch the missing line and start handling this latter miss after thread 0 is done.

I dont know if I understand this state correctly. If I'm right, what is the purpose of this processing sequence? Is it for LRU update order.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.