[Cryptech Core] proposed core reorganization
Павел Шатов
meisterpaul1 at yandex.ru
Sat Feb 28 09:13:26 UTC 2015
On 27.02.2015 0:44, Paul Selkirk wrote:
> I just committed a 'toolsrun' branch on user/paul/core.
>
> This organization puts the platform- and project-specific files
> (top-level verilog files, build files) under the communications channel
> core, e.g. core/eim/toolruns/xilinx/novena,
> core/uart/toolruns/quartus/terasic_c5g.
>
> The biggest stumbling block was figuring out how the uart register
> module should pass config options to the uart core module. I did manage
> to build it under Quartus (and left the build artifacts in place), but I
> don't have the hardware to test it.
>
> Joachim and Pavel: Do either of these approaches make sense to you, or
> is there some other way we should organize the FPGA code?
>
> paul
>
> On 02/24/2015 12:04 PM, Paul Selkirk wrote:
>> Now that we've stabilized the EIM code in the 'test' tree, I've been
>> working on how/where to move it in the 'core' tree. I recently committed
>> a possible organization in 'user/paul/core', and would appreciate some
>> feedback on it.
>>
>> We have several kinds of cores in the 'core' tree:
>> - those that do something useful (hash, cipher, rng)
>> - host-fpga communication channels (uart, i2c, eim, coretest)
>> - platform/project specific (novena[i2c], novena_i2c_simple, novena_eim)
>>
>> To the extent possible, I've separated the EIM files into a generic
>> top-level core, alongside uart and i2c. (One could argue about how
>> generic these communication channels are, given that we have exactly one
>> platform that uses uart, and one that uses i2c and eim.)
>>
>> This leaves a single novena core directory, which builds both the i2c
>> and eim projects. Note this means two top-level verilog files, two
>> Makefiles, two .xise files, two .ucf files, which is unavoidably ugly.
>>
>> The Makefiles or project files have to know about every core to include
>> in the project, but the actual mux operation happens in core_selector
>> (hash_selector, etc), which is controlled by ifdefs in the code. I find
>> this extremely ugly, but I wasn't able to get a clean design where I
>> define say USE_CORE_SHA1 in say novena_toplevel.v, and have it control
>> synthesis in hash_selector.v. With ISE, I had to switch to "manual
>> compile order", but reordering files in the Makefile didn't work at all
>> - apparently each file in the command-line build is a separate
>> compilation unit. But I digress.
Paul, having defines in the top-level module is impossible, because they
will not be visible in other modules. If you want to have defines
separated, you can create a small file, say core_settings.v, move all
the defines to this small file and then include it in core_selector. Is
this what you want to do? I'm not very much familiar with console build
process, I mostly use GUI flow.
>> The thing that's missing from my tree is uart and the Terasic project.
>> Joachim buries the project-specific stuff under
>> coretest_hashes/toolruns, because coretest_hashes.v is, at the same
>> time, a generic mux and a project-specific file (with specific
>> connections to the uart and the hash cores). As I discovered when I
>> started working on i2c, I needed an i2c-specific version of
>> coretest_hashes.v. My new stuff instantiates the communications channel
>> in the top-level, so at least removes that from the mux. But the
>> question remains:
>>
>> Do we want explicit top-level cores for each platform (core/novena,
>> core/terasic, core/alpha)? Or do we maybe want to bury the
>> platform-specific stuff under say the communications channel core (e.g.
>> core/eim/toolruns/xilinx/novena, core/i2c/toolruns/xilinx/novena,
>> core/uart/toolruns/quartus/terasic_c5g)?
Since I joined this project I've worked with Novena only. As far as I
understand, you have another platform (some Terasic Cyclone V board) and
you want to have a somewhat more unified project for both platforms and
for the forthcoming Alpha?
I've taken a look at coretest_hashes. Is this the current project for
Terasic board? If we want it be unified with Novena, we should rewrite
it. Do you remember the partitioning of my baseline design for Novena?
It's top-level has three instantiations: 1)clock manager and 2)EIM
arbiter are platform-specific, 3)core_selector which should be common
for all platforms.
Coretast_hashes should have the same structure: all the core
instantiations and the core multiplexor should be replaced with
core_selector. Again, this core_selector should be common for all our
platforms, it is basically a set of registers and has a memory-like
interface. Both EIM arbiter for Novena and UART module for Terasic have
memory-like interfaces too, so everything fits together nicely. The only
difference is that EIM arbiter has Read/Write flags and UART module has
ChipSelect/WriteEnable flags, which are equivalent, I've already
discussed this.
My opinion is that we should have separate top-level modules for each
platform. We are going to have different constraint files anyway, so it
makes sense. Platform-specific stuff should be packed in modules and
instantiated from the top-level module.
If I were organizing the repository, I would have something like this:
core/
core/common/
core/common/core_selector.v
core/common/...
core/common/hash/
core/common/hash/sha-256
core/common/hash/sha-512
core/common/hash/...
core/common/cipher/
core/common/cipher/des
core/common/cipher/aes
core/common/cipher/...
core/common/rng/
core/common/rng/...
core/platforms/
core/platforms/novena/
core/platforms/novena/novena_top.v
core/platforms/novena/constraints_novena.xxx
core/platforms/novena/...
core/platforms/novena/eim/
core/platforms/novena/eim/eim_arbiter.v
core/platforms/novena/eim/...
core/platforms/terasic/
core/platforms/terasic/terasic_top.v
core/platforms/terasic/constraints_terasic.xxx
core/platforms/terasic/...
core/platforms/terasic/uart/
core/platforms/terasic/uart/uart.v
core/platforms/terasic/i2c/
core/platforms/terasic/i2c/i2c.v
What is I2C used for btw?
--
With best regards,
Pavel Shatov
More information about the Core
mailing list