Template

RegFab uses template mechanism for extension, to generate various output based on tool’s core data. User can develop his own templates for different purposes.

Builtin Templates

RegFab comes with some builtin templates, they are located: templates/mako/register/, including:

  • html.mako - HTML doc template

  • code-verilog.mako - Register design code in Verilog

  • code-c-header.mako - C language header file

  • uvm-regmodel.mako - UVM register model

  • svd.mako - System-View-Description file

  • Trace32.mako - Lauterbach Trace32 peripheral file

  • docx.mako - Microsoft Word .docx file

To generate output with these templates, run command with switch -t <template>. RegFab will search for the template from current directory and builtin location, and current directory has higher priority. Regarding the template name, you can specify the filename with or without extension .mako, or the filename with full path.:

$> qk regfab -t html xxx.xml
$> qk regfab -t code-verilog xxx.xml
$> qk regfab -t code-c xxx.xml
$> qk regfab -t code-c-header xxx.xml
$> qk regfab -t uvm-regmodel xxx.xml
$> qk regfab -t svd xxx.xml
$> qk regfab -t Trace32 xxx.xml
$> qk regfab -t docx xxx.xml

With switch -o filename, the generated content will write into a file, otherwise the content will print on screen.:

$> qk regfab -t html -o doc.html xxx.xml

Variable Context

When user is developing his own templates, he has to know the Variable Context which is defined by this tool.

From mako template point of view, some top-level variables can be seen:

  • module - Component instance

  • registers - All registers ordered by address

  • memories - All memories ordered by address

  • regmems - All registers & memories ordered by addressd

  • interfaces - All interfaces

  • regsets - All regsets ordered by offset

module property
  • Name - module name

  • ClkStyle - clock style, values can be: synchronous, asynchronous

  • Version - tool version

register property
  • isMemory - always False

  • Name - register name

  • RegType - register type, values can be user defined types

  • Offset - register offset to regset

  • ifOffset - register offset to interface

  • address - register address

  • DataWidth - register data-width

  • resetValue - register reset value

  • resetMask - register reset mask

  • resetMode - register reset mode, values can be: synchronous, asynchronous

  • resetLevel - reset level: 0/1

  • hexIfOffset - hex string of ifOffset

  • hexAddress - hex string of address

  • hexResetValue - hex string of resetValue

  • hexResetMask - hex string of resetMask

  • access - combination of iAccess and xAccess as: ‘xAccess:iAccess’, iAccess/xAccess can be: R,W,RW,RS,WS,RSWS

  • sortedBits() - all bit-field list, sorted by offset in descending order

  • iterWholeBits() - all bit-field list, including blank bits, use reg.isblank to determine whether it’s a blank bit

memory property
  • isMemory - always True

  • Size - memory size

  • hexSize - hex string of Size

bitfield property
  • Name - bitfield name

  • Offset - bitfield offset

  • Width - bitfield width

  • Reserved - reserved status, can be: reserved, unreserved

  • iAccess - internal access instance

  • xAccess - external access instance

  • resetValue - bitfield reset value

  • resetMask - bitfield reset mask

  • high - bitfield high bit

  • low - bitfield low bit

  • slice - string of ‘high:low

  • enums - bit enumeration list

bitfield-enum property
  • Name - enum name

  • Value - enum value

example1:

% for reg in registers:
${reg.hexOffset}: ${reg.Name}
>> ${reg.RegType} - ${reg.hexResetValue} - ${reg.hexResetMask} - ${reg.access}

% endfor