Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Default folder structure #37

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,18 @@ project/boot/
project/project
project/plugins/project/

# Scala-IDE specific
# IntelliJ specific
.scala_dependencies
.worksheet
.bloop

.idea
out

# Metals
# VSCode / Metals
.vscode
.metals
.bsp
project/metals.sbt

# Eclipse
Expand All @@ -41,7 +43,7 @@ bin/
*.vcd
!tester/src/test/resources/*.vhd


gen/
simWorkspace/
tmp/
null
38 changes: 18 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ sbt "runMain projectname.MyTopLevelVhdl"
sbt "runMain projectname.MyTopLevelSim"
```

* The example hardware description is into `hw/spinal/projectname/MyTopLevel.scala`
* The testbench is into `hw/spinal/projectname/MyTopLevelSim.scala`
* The example hardware description is in `src/main/scala/projectname/MyTopLevel.scala`
* The testbench is in `src/main/scala/spinal/projectname/MyTopLevelSim.scala`

When you really start working with SpinalHDL, it is recommended (both for comfort and efficiency) to use an IDE, see the [Getting started](https://spinalhdl.github.io/SpinalDoc-RTD/master/SpinalHDL/Getting%20Started/index.html).

Expand All @@ -38,34 +38,32 @@ When you really start working with SpinalHDL, it is recommended (both for comfor

### Change project name

You might want to change the project name, which is currently `projectname`. To do so (let's say your actual project name is `myproject`; it must be all lowercase with no separators):
You might want to change the project name, which is currently `projectname`. To do so (let's say your actual project name is `myproject`):

* Update `build.sbt` and/or `build.sc` by replacing `projectname` by the name of your project `myproject` (1 occurrence in each file). The better is to replace in both (it will always work), but in some contexts you can keep only one of these two files:
* Update `build.sbt` and/or `build.sc` by replacing `projectname` by the name of your project `myproject`. The better is to replace in both (it will always work), but in some contexts you can keep only one of these two files:
* If you are sure all people only use `sbt`, you can replace only in `build.sbt` and remove `build.sc`
* If you are sure all people only use `mill`, you can replace only in `build.sc` and remove `build.sbt`
* Replace in both files for open-source project.
* Put all your scala files into `hw/spinal/myproject/` (remove the unused `hw/spinal/projectname/` folder)
* Start all your scala files with `package myproject`


### Change project structure

You can change the project structure as you want. The only restrictions (from Scala environment) are (let's say your actual project name is `myproject`):

* you must have a `myproject` folder and files in it must start with `package myproject`
* if you have a file in a subfolder `myproject/somepackage/MyElement.scala` it must start with `package myproject.somepackage`.
* `sbt` and `mill` must be run right in the folder containing their configurations (recommended to not move these files)

Once the project structure is modified, update configurations:

* In `build.sbt` and/or `build.sc` (see above) replace `/ "hw" / "spinal"` by the new path to the folder containing the `myproject` folder.
* In the spinal configuration file (if you kept it, by default it is in `projectname/Config.scala`) change the path in `targetDirectory = "hw/gen"` to the directory where you want generated files to be written. If you don't use a config or if it doesn't contain this element, generated files will be written in the root directory.
* Rename the `src/main/scala/spinal/projectname` folder to `src/main/scala/spinal/myproject`
* Replace `package projectname` all scala files with `package myproject`

If you want/need separators in the project name then a `.` can be used as a separator, but the folder structure/build files need to be adapted accordingly.
You'll need to follow the rules for Java package names / structure.

### Update this README

Of course you can replace/modify this file to help people with your own project!

### Reinitialize repository

There is no need to keep the git history of the template. The easiest is to remove the `.git` folder and initialize a clean repository:

```sh
rm -rf .git
git init
git add .
git commit -m "Initial project setup"
```

## Mill Support (Experimental)

Expand Down
7 changes: 3 additions & 4 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
ThisBuild / version := "1.0"
ThisBuild / version := "0.1"
ThisBuild / scalaVersion := "2.12.18"
ThisBuild / organization := "org.example"
ThisBuild / organization := "projectname"

val spinalVersion = "1.9.4"
val spinalCore = "com.github.spinalhdl" %% "spinalhdl-core" % spinalVersion
Expand All @@ -9,8 +9,7 @@ val spinalIdslPlugin = compilerPlugin("com.github.spinalhdl" %% "spinalhdl-idsl-

lazy val projectname = (project in file("."))
.settings(
Compile / scalaSource := baseDirectory.value / "hw" / "spinal",
libraryDependencies ++= Seq(spinalCore, spinalLib, spinalIdslPlugin)
libraryDependencies ++= Seq(spinalCore, spinalLib, spinalIdslPlugin, "org.scalatest"%%"scalatest"%"3.1.1")
)

fork := true
5 changes: 1 addition & 4 deletions build.sc
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import mill._, scalalib._

val spinalVersion = "1.9.0"
val spinalVersion = "1.9.4"

object projectname extends SbtModule {
def scalaVersion = "2.12.16"
override def millSourcePath = os.pwd
def sources = T.sources(
millSourcePath / "hw" / "spinal"
)
def ivyDeps = Agg(
ivy"com.github.spinalhdl::spinalhdl-core:$spinalVersion",
ivy"com.github.spinalhdl::spinalhdl-lib:$spinalVersion"
Expand Down
File renamed without changes.
1 change: 0 additions & 1 deletion hw/gen/.gitignore

This file was deleted.

31 changes: 0 additions & 31 deletions hw/spinal/projectname/MyTopLevelSim.scala

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import spinal.core.sim._

object Config {
def spinal = SpinalConfig(
targetDirectory = "hw/gen",
targetDirectory = "gen",
defaultConfigForClockDomains = ClockDomainConfig(
resetActiveLevel = HIGH
),
Expand Down
35 changes: 35 additions & 0 deletions src/main/scala/projectname/MyTopLevelSim.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package projectname

import spinal.core._
import spinal.core.sim._

import org.scalatest.funsuite.AnyFunSuite

class MyTopLevelSim extends AnyFunSuite {
test("blub") {
Config.sim.compile(MyTopLevel()).doSim { dut =>
// Fork a process to generate the reset and the clock on the dut
dut.clockDomain.forkStimulus(period = 10)

var modelState = 0
for (idx <- 0 to 99) {
// Drive the dut inputs with random values
dut.io.cond0.randomize()
dut.io.cond1.randomize()

// Wait a rising edge on the clock
dut.clockDomain.waitRisingEdge()

// Check that the dut values match with the reference model ones
val modelFlag = modelState == 0 || dut.io.cond1.toBoolean
assert(dut.io.state.toInt == modelState)
assert(dut.io.flag.toBoolean == modelFlag)

// Update the reference model value
if (dut.io.cond0.toBoolean) {
modelState = (modelState + 1) & 0xff
}
}
}
}
}
File renamed without changes.
Empty file.