more context
Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
parent
0decfd5ea5
commit
f4dca24bac
273
index.html
273
index.html
@ -217,10 +217,11 @@
|
||||
</section>
|
||||
<section data-transition="fade-in slide-out">
|
||||
<h2>What is an Emulator?</h2>
|
||||
<img src="media/bbs-example.png">
|
||||
<img src="media/vt100-MA-4352.png">
|
||||
</section>
|
||||
<section>
|
||||
<h2>Emulation Depends on your Goals!</h2>
|
||||
<p class="fragment">Emulation is a lie</p>
|
||||
</section>
|
||||
<!-- <section>
|
||||
<h2>Renode Is Many of These</h2>
|
||||
@ -233,11 +234,7 @@
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section data-transition="fade-out">
|
||||
<h2>What is a Computer?</h2>
|
||||
<img class="fragment" src="media/bluenrg-block-diagram.png">
|
||||
</section>
|
||||
<section data-transition="fade">
|
||||
<section data-transition="slide-in fade-out">
|
||||
<h2>What is a Computer?</h2>
|
||||
<ul>
|
||||
<li>A system of devices</li>
|
||||
@ -292,10 +289,11 @@
|
||||
IRQ -> cpu@0
|
||||
|
||||
cpu: CPU.CortexM @ sysbus
|
||||
nvic: nvic
|
||||
cpuType: "cortex-m0+"
|
||||
PerformanceInMips: 24
|
||||
nvic: nvic
|
||||
</code></pre>
|
||||
bluenrg-1.repl
|
||||
</section>
|
||||
</section>
|
||||
|
||||
@ -412,10 +410,11 @@
|
||||
cpuType: "cortex-m0+"
|
||||
PerformanceInMips: 24
|
||||
</code></pre>
|
||||
bluenrg-1.repl
|
||||
</section>
|
||||
<section>
|
||||
<h2>Setting up Renode</h2>
|
||||
<pre data-id="code-animation"><code data-trim>
|
||||
<pre data-id="code-animation"><code data-trim data-line-numbers="|1|2|3-5|6|">
|
||||
machine LoadPlatformDescription @bluenrg-1.repl
|
||||
sysbus LoadBinary @BLE_Chat_Server.bin 0x10040000
|
||||
cpu VectorTableOffset 0x10040000
|
||||
@ -464,151 +463,96 @@
|
||||
<h2>Modify an Existing Block</h2>
|
||||
</section>
|
||||
<section>
|
||||
<h2>Example Serial Port: LiteX UART</h2>
|
||||
<pre class="code-animation"><code class="cs" data-trim data-line-numbers="|132-140|118-126|125|20-33">
|
||||
//
|
||||
// Copyright (c) 2010-2018 Antmicro
|
||||
//
|
||||
// This file is licensed under the MIT License.
|
||||
// Full license text is available in 'licenses/MIT.txt'.
|
||||
//
|
||||
using System.Collections.Generic;
|
||||
using Antmicro.Renode.Peripherals.Bus;
|
||||
using Antmicro.Renode.Core.Structure.Registers;
|
||||
using Antmicro.Renode.Core;
|
||||
using Antmicro.Renode.Logging;
|
||||
|
||||
namespace Antmicro.Renode.Peripherals.UART
|
||||
{
|
||||
public class LiteX_UART : UARTBase, IDoubleWordPeripheral, IBytePeripheral, IKnownSize
|
||||
<h2>Example Serial Port: AxiUartLite</h2>
|
||||
<pre class="code-animation"><code class="cs" data-trim data-line-numbers="|80-83|55-61|35-45|39-45">
|
||||
//
|
||||
// Copyright (c) 2010-2018 Antmicro
|
||||
//
|
||||
// This file is licensed under the MIT License.
|
||||
// Full license text is available in 'licenses/MIT.txt'.
|
||||
//
|
||||
using System;
|
||||
using Antmicro.Renode.Peripherals.Bus;
|
||||
using System.Collections.Generic;
|
||||
using Antmicro.Renode.Core;
|
||||
using Antmicro.Renode.Logging;
|
||||
using Antmicro.Renode.Peripherals.Miscellaneous;
|
||||
using Antmicro.Migrant;
|
||||
|
||||
namespace Antmicro.Renode.Peripherals.UART
|
||||
{
|
||||
public LiteX_UART(Machine machine) : base(machine)
|
||||
[AllowedTranslations(AllowedTranslation.ByteToDoubleWord)]
|
||||
public class AxiUartLite : IDoubleWordPeripheral, IUART, IKnownSize
|
||||
{
|
||||
IRQ = new GPIO();
|
||||
var registersMap = new Dictionary<long, DoubleWordRegister>
|
||||
public AxiUartLite()
|
||||
{
|
||||
{(long)Registers.RxTx, new DoubleWordRegister(this)
|
||||
.WithValueField(0, 8,
|
||||
writeCallback: (_, value) =>
|
||||
this.TransmitCharacter((byte)value),
|
||||
valueProviderCallback: _ => {
|
||||
if(!TryGetCharacter(out var character))
|
||||
{
|
||||
this.Log(LogLevel.Warning, "Empty Rx FIFO.");
|
||||
}
|
||||
return character;
|
||||
})
|
||||
},
|
||||
{(long)Registers.TxFull, new DoubleWordRegister(this)
|
||||
.WithFlag(0, FieldMode.Read) //tx is never full
|
||||
},
|
||||
{(long)Registers.RxEmpty, new DoubleWordRegister(this)
|
||||
.WithFlag(0, FieldMode.Read, valueProviderCallback: _ => Count == 0)
|
||||
},
|
||||
{(long)Registers.EventPending, new DoubleWordRegister(this)
|
||||
// `txEventPending` implements `WriteOneToClear` semantics to avoid fake warnings
|
||||
// `txEventPending` is generated on the falling edge of TxFull; in our case it means never
|
||||
.WithFlag(0, FieldMode.Read | FieldMode.WriteOneToClear, valueProviderCallback: _ => false, name: "txEventPending")
|
||||
.WithFlag(1, out rxEventPending, FieldMode.Read | FieldMode.WriteOneToClear, name: "rxEventPending")
|
||||
.WithWriteCallback((_, __) => UpdateInterrupts())
|
||||
},
|
||||
{(long)Registers.EventEnable, new DoubleWordRegister(this)
|
||||
.WithFlag(0, name: "txEventEnabled")
|
||||
.WithFlag(1, out rxEventEnabled)
|
||||
.WithWriteCallback((_, __) => UpdateInterrupts())
|
||||
},
|
||||
};
|
||||
|
||||
registers = new DoubleWordRegisterCollection(this, registersMap);
|
||||
}
|
||||
|
||||
public uint ReadDoubleWord(long offset)
|
||||
{
|
||||
return registers.Read(offset);
|
||||
}
|
||||
|
||||
public byte ReadByte(long offset)
|
||||
{
|
||||
if(offset % 4 != 0)
|
||||
{
|
||||
// in the current configuration, only the lowest byte
|
||||
// contains a meaningful data
|
||||
return 0;
|
||||
readFifo = new Queue<uint>();
|
||||
}
|
||||
return (byte)ReadDoubleWord(offset);
|
||||
}
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
base.Reset();
|
||||
registers.Reset();
|
||||
|
||||
UpdateInterrupts();
|
||||
}
|
||||
|
||||
public void WriteDoubleWord(long offset, uint value)
|
||||
{
|
||||
registers.Write(offset, value);
|
||||
}
|
||||
|
||||
public void WriteByte(long offset, byte value)
|
||||
{
|
||||
if(offset % 4 != 0)
|
||||
|
||||
public void WriteChar(byte value)
|
||||
{
|
||||
// in the current configuration, only the lowest byte
|
||||
// contains a meaningful data
|
||||
return;
|
||||
readFifo.Enqueue(value);
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
readFifo.Clear();
|
||||
}
|
||||
|
||||
public uint ReadDoubleWord(long offset)
|
||||
{
|
||||
switch((Register)offset)
|
||||
{
|
||||
case Register.RxFIFO:
|
||||
if(readFifo.Count == 0)
|
||||
{
|
||||
this.Log(LogLevel.Warning, "Trying to read from empty fifo.");
|
||||
return 0;
|
||||
}
|
||||
return readFifo.Dequeue();
|
||||
case Register.Status:
|
||||
// Tx FIFO Empty | Rx FIFO Valid Data
|
||||
return (1u << 2) | (readFifo.Count == 0 ? 0 : 1u);
|
||||
default:
|
||||
this.LogUnhandledRead(offset);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public void WriteDoubleWord(long offset, uint value)
|
||||
{
|
||||
switch((Register)offset)
|
||||
{
|
||||
case Register.TxFIFO:
|
||||
CharReceived?.Invoke((byte)value);
|
||||
break;
|
||||
default:
|
||||
this.LogUnhandledWrite(offset, value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
[field: Transient]
|
||||
public event Action<byte> CharReceived;
|
||||
|
||||
public long Size { get { return 0x10; } }
|
||||
public Bits StopBits { get { return Bits.One; } }
|
||||
public Parity ParityBit { get { return Parity.None; } }
|
||||
public uint BaudRate { get { return 0; } }
|
||||
|
||||
private readonly Queue<uint> readFifo;
|
||||
|
||||
private enum Register
|
||||
{
|
||||
RxFIFO = 0x0,
|
||||
TxFIFO = 0x4,
|
||||
Status = 0x8,
|
||||
Control = 0xC
|
||||
}
|
||||
|
||||
WriteDoubleWord(offset, value);
|
||||
}
|
||||
|
||||
public long Size => 0x100;
|
||||
|
||||
public GPIO IRQ { get; private set; }
|
||||
|
||||
public override Bits StopBits => Bits.One;
|
||||
|
||||
public override Parity ParityBit => Parity.None;
|
||||
|
||||
public override uint BaudRate => 115200;
|
||||
|
||||
protected override void CharWritten()
|
||||
{
|
||||
UpdateInterrupts();
|
||||
}
|
||||
|
||||
protected override void QueueEmptied()
|
||||
{
|
||||
UpdateInterrupts();
|
||||
}
|
||||
|
||||
private void UpdateInterrupts()
|
||||
{
|
||||
// rxEventPending is latched
|
||||
rxEventPending.Value = (Count != 0);
|
||||
|
||||
// tx fifo is never full, so `txEventPending` is always false
|
||||
var eventPending = (rxEventEnabled.Value && rxEventPending.Value);
|
||||
IRQ.Set(eventPending);
|
||||
}
|
||||
|
||||
private IFlagRegisterField rxEventEnabled;
|
||||
private IFlagRegisterField rxEventPending;
|
||||
private readonly DoubleWordRegisterCollection registers;
|
||||
|
||||
private enum Registers : long
|
||||
{
|
||||
RxTx = 0x0,
|
||||
TxFull = 0x04,
|
||||
RxEmpty = 0x08,
|
||||
EventStatus = 0x0c,
|
||||
EventPending = 0x10,
|
||||
EventEnable = 0x14,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</code></pre>
|
||||
AxiUartLite.cs
|
||||
</section>
|
||||
<section>
|
||||
<h2>Steps to Set Up a Serial Port</h2>
|
||||
@ -629,10 +573,12 @@
|
||||
<section>
|
||||
<h2>Peripheral Rapid Development</h2>
|
||||
<img src="media/hardware-20191117-cropped.jpg">
|
||||
Betrusted Prototype
|
||||
</section>
|
||||
<section>
|
||||
<h2>Peripheral Rapid Development</h2>
|
||||
<video class="r-stretch" data-autoplay src="media/Renode-20191117-trimmed.m4v"></video>
|
||||
<p>Hackaday Supercon 2019</p>
|
||||
</section>
|
||||
<section data-transition="fade-out">
|
||||
<h2>Advantages of Emulation</h2>
|
||||
@ -642,6 +588,11 @@
|
||||
<h2>Advantages of Emulation</h2>
|
||||
<img src="media/renode-xous-double-uart-tiled.png">
|
||||
</section>
|
||||
<section>
|
||||
<h2>Getting Hardware to Users</h2>
|
||||
<img src="media/betrusted-engine-block-diagram.png" class="r-stretch">
|
||||
<p>Betrusted ENGINE</p>
|
||||
</section>
|
||||
<section>
|
||||
<h2>Getting Hardware to Users</h2>
|
||||
<img src="media/betrusted-wycheproof-patch.png">
|
||||
@ -650,6 +601,9 @@
|
||||
<h2>Getting Hardware to Users</h2>
|
||||
<img src="media/betrusted-wycheproof-patch-fix.png">
|
||||
</section>
|
||||
<section>
|
||||
<h2>Emulation brings more eyes to the project</h2>
|
||||
</section>
|
||||
</section>
|
||||
<!--
|
||||
<section>
|
||||
@ -722,7 +676,7 @@
|
||||
<section>
|
||||
<section>
|
||||
<h2>Robot Framework: Running Tests in CI</h2>
|
||||
<pre class="code-animation"><code class="robot" data-trim data-line-numbers="|1-6|8-18|20-26|28-40">
|
||||
<pre class="code-animation"><code class="robot" data-trim data-line-numbers="|1-6|8-18|20-26|28-40|39-40">
|
||||
*** Settings ***
|
||||
Suite Setup Setup
|
||||
Suite Teardown Teardown
|
||||
@ -746,24 +700,25 @@
|
||||
Create Machine
|
||||
Execute Command mach create
|
||||
Execute Command machine
|
||||
... LoadPlatformDescriptionFromString ${LIS2DS12}
|
||||
... LoadPlatformDescriptionFromString ${LIS2DS12}
|
||||
Execute Command sysbus LoadELF
|
||||
... ${URI}/nrf52840--zephyr_lis2dh.elf-s_747800-163b7e7cc986d4b1115f06b5f3df44ed0defc1fa
|
||||
... ${URI}/nrf52840--zephyr_lis2dh.elf-s_747800-163b7e7cc986d4b1115f06b5f3df44ed0defc1fa
|
||||
|
||||
*** Test Cases ***
|
||||
Should Read Acceleration
|
||||
Create Machine
|
||||
Create Terminal Tester ${UART}
|
||||
|
||||
Execute Command sysbus.twi1.lis2ds12 AccelerationX 10
|
||||
Execute Command sysbus.twi1.lis2ds12 AccelerationY 5
|
||||
Execute Command sysbus.twi1.lis2ds12 AccelerationZ -5
|
||||
Execute Command sysbus.twi1.lis2ds12 AccelerationX 10
|
||||
Execute Command sysbus.twi1.lis2ds12 AccelerationY 5
|
||||
Execute Command sysbus.twi1.lis2ds12 AccelerationZ -5
|
||||
|
||||
Start Emulation
|
||||
|
||||
Wait For Line On Uart
|
||||
... x 9.997213 , y 4.997410 , z -4.999803
|
||||
</code></pre>
|
||||
... x 9.997213 , y 4.997410 , z -4.999803
|
||||
</code></pre>
|
||||
<p>LIS2DS12.robot</p>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
@ -772,7 +727,7 @@
|
||||
</section>
|
||||
<section>
|
||||
<h2>SVD: Standard Chip Documentation</h2>
|
||||
<pre class="code-animation"><code class="xml" data-trim data-line-numbers="|3-9|25-87|27-31|39-57|43|46-47|48-56">
|
||||
<pre class="code-animation"><code class="xml" data-trim data-line-numbers="|3-9|25-87|27-31|31|39-57|41|43|46-47|48-56">
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<device xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="1.1" xsi:noNamespaceSchemaLocation="CMSIS-SVD_Schema_1_1_draft.xsd">
|
||||
<vendor>STMicroelectronics</vendor>
|
||||
@ -862,6 +817,7 @@
|
||||
</peripherals>
|
||||
</device>
|
||||
</code></pre>
|
||||
<p>BlueNRG2.svd</p>
|
||||
</section>
|
||||
<section>
|
||||
<h2>SVD: Using with Renode</h2>
|
||||
@ -895,6 +851,15 @@
|
||||
<img src="media/renode-multi-system.png">
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<h2>Other Features</h2>
|
||||
<ul>
|
||||
<li>Loading peripherals at runtime</li>
|
||||
<li>Adding custom instructions to Risc-V</li>
|
||||
<li>Python hooks for memory access</li>
|
||||
<li>Networking</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section>
|
||||
<h2>Renode is Free Software</h2>
|
||||
Give it a try!
|
||||
|
BIN
media/betrusted-engine-block-diagram.png
Normal file
BIN
media/betrusted-engine-block-diagram.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
BIN
media/frame.png
Normal file
BIN
media/frame.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
BIN
media/vt100-MA-4352.png
Normal file
BIN
media/vt100-MA-4352.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 135 KiB |
BIN
media/vt100-MA-4356.png
Normal file
BIN
media/vt100-MA-4356.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 76 KiB |
Loading…
Reference in New Issue
Block a user