【SystemVerilog】design에서 bind를 사용해 보자

소개



여러분, SystemVerilog 사용하고 있습니까?

Verilog에서 Verilog2001, SystemVerilog 및 언어 사양은 다양한 확장되어 사용하기 쉬워지고 있습니다.
그러나 LRM을 읽은 것만으로는 실제로 어떻게 사용하면 유익한지 모르는 것도 많네요.

거기서 이번은 bind를 합성에 사용해 얻기를 시도하는 시도입니다.

샘플 코드



FPGA의 톱 모듈로 top이 있다고 가정합니다.

top.sv
module top (
    input  logic        CLK        , // 
    input  logic        RESET      , // 
    input  logic [7:0]  X          , // 
    input  logic [7:0]  Y          , // 
    output logic [8:0]  Q          , // 
    output logic [7:0]  DEBUG        // 
);
    add u_add (
        .CLK   (CLK   ) ,
        .RESET (RESET ) ,
        .A     (X     ) ,
        .B     (Y     ) ,
        .Q     (Q     )
    );
endmodule

DEBUG 단자는 이름대로 디버깅용입니다. 동작 확인용 LED이거나 오실로 로지아나 등에서 볼 수 있도록 핀 헤더에 내거나 하는군요.

Quartus에서 합성 후 RTL Viewer에서 확인.


디버깅을 위한 회로를 bind로 구현해 봅시다.
bind는 모듈을 추가하는 이미지입니다.
추가 할 디버깅에 대한 설명을 top_debug라는 모듈로 작성했습니다.

debug.sv
module top_debug (
    input  logic        CLK        , // 
    input  logic        RESET      , // 
    input  logic [8:0]  Q_IN       , // 
    output logic        PTY_ODD      // 
);

    logic r_pty_odd;

    always_ff @(posedge CLK or posedge RESET) begin
        if(RESET)begin
            r_pty_odd <= '0;
        end else begin
            r_pty_odd <= ^Q_IN;
        end
    end
    assign PTY_ODD = r_pty_odd;
endmodule

bind top
    top_debug u_debug (
        .CLK     (CLK      ),
        .RESET   (RESET    ),
        .Q_IN    (Q        ),
        .PTY_ODD (DEBUG[0] )
    );

top 모듈에 top_debug 모듈을 u_debug라는 이름으로 인스턴스화합니다.
신호명 등은 top 모듈 내의 신호를 사용할 수 있습니다.
bind 설명은 module 블록 외부에서도 설명이 가능합니다.



제대로 추가되었습니다!
top.sv에는 일체를 추가하지 않고 프로젝트에 debug.sv를 추가한 것만으로 디버그용 회로를 추가할 수 있었습니다.

문제점



움직이기 위해서는 움직이지만 ...라는 이야기.

회로 추가만 가능



bind에서 변경하거나 삭제할 수 없습니다. 이것으로 가장 곤란한 것은, bind로 생성한 신호 출력을 연결하는 목적지의 포트가 미리 필요하다는 점입니다.
본래 상정된 사용법과는 다르기 때문에 어쩔 수 없습니다만, 꽤 엄격한 제약입니다. 최소한 포트 추가가 가능하면 ...
도트에 의한 하위 계층의 참조는 Vivado라면 가능합니다만 Quartus에서는 안 됩니다.

도구가 제한됨



「bind를 합성으로? 할 수 있어!」라고 말했지만, 실제로는 무엇이든 갈 수 있는 것은 아니었습니다.


도구       
버전
합성
비고


Quartus Prime Standard
18.1
×
bind 설명이 syntax error가 된다

Quartus Prime Pro
19.2

이번에 시도한 것은 여기

Vivado
2018.3.1
×
bind 기술은 합성의 대상외가 된다


Quartus Prime Standard는 합성 엔진이 완전히 지원되지 않았습니다. 버전이 새롭다면 갈지도 모르지만, 소망은 얇아 보인다.
Prime Pro는 Stratix10 등의 특정 디바이스용으로 사용 장면은 한정되어 온다.
Vivado는 합성 자체 통과하므로 인식은 하고 있지만, 그 뒤로 검증용 기술로 간주해도 전 무시. 옵션 등으로 뭔가 할 수 있을지도 모릅니다 만, 이쪽도 원하는 얇은.

microsemi와 Lattice는 시도하고 있지 않지만, 안 되는 것(syntax error)한 예감이 있네요.
만약 시도하는 것이 계시다면 코멘트 해 주시면 고맙습니다.

결론



「할 수 있어!」라고 할까, 「할 수 있을 뿐이다!」가 정답이군요.
우연히 Quartus Prime Pro 19.2에서 할 수 있었기 때문에 음색을 타고 기사를 썼지만, 다른 버전을 시도하면 이런 것입니다.

bind를 사용한 적이 있는 사람은 아마 거의 모두가 검증 목적일 것입니다.
구체적으로 말하면 「어설션 기술이나 펑션 커버리지 기술을 모듈에 붙인다」군요.

바인드를 합성으로 사용하는 것은 인류에게는 너무 이른 것 같습니다.

좋은 웹페이지 즐겨찾기