如何在PyGears中集成Jinja模块

问题描述

我创建了jinja模块作为示例,

{% from 'snippet.j2' import module with context %}
{% call module() %}
    logic [$size(din.data)-1 : 0] res;
    assign res = din.data * din.data;
  {% if params['half'] %}
    assign dout.data = res / 2;
  {% else %}
    assign dout.data = res;
  {% endif %}
    assign din.ready = dout.ready;
    assign dout.valid = din.valid;
{% endcall %}

我应该如何在PyGears中使用此模块?

解决方法

好的,我认为这应该可行。

如果我正确理解,您正在尝试为将要乘以1/2(换句话说,除以2)的模块创建Jinja模板。首先,确保您的Jinja文件和模块命名相同(这是必须的,因此PyGears会知道要使用哪个Jinja模板)。

牢记所有这些,让我们假设我们的模块名称为 mulh

Python文件将如下所示:

from pygears import gear, Intf, reg
from pygears.typing import Uint
from pygears.hdl import hdlgen
@gear
def mulh(din: Uint,*,half=False)->b'din*din':
    pass
mulh(Intf(Uint[8]))
hdlgen('/mulh', outdir='.')

此代码将调用您的Jinja文件,并且HDL输出看起来像这样:

module mulh
(
    input logic clk,    input logic rst,    dti.consumer din, // u8 (8)
    dti.producer dout // u16 (16)
);
    typedef logic [7:0] din_t; // u8
    typedef logic [15:0] dout_t; // u16
    din_t din_s;
    dout_t dout_s;
    assign din_s = din.data;
    assign dout.data = dout_s;
    logic [$size(din.data)-1 : 0] res;
    assign res          = din.data * din.data;
    assign dout.data    = res;
    assign din.ready    = dout.ready;
    assign dout.valid   = din.valid;
endmodule

为了更轻松地拍摄所有这些照片,我在下面做了这张照片 enter image description here