[SystemVerilog] UVM용 configdb란?

9660 단어 HDLUVMSystemVerilog
얼마 전 Mentor Graphics는 ASIC FPGA의 검증 방법에 대한 보고서를 발표했다.
  • 2020 Wilson Research Group Functional Verification Study: FPGA Functional Verification Trend Report
  • 2020 Wilson Research Group Functional Verification Study: IC/ASIC Functional Verification Trend Report
  • 보고서에 따르면 UVM 채택률은 다음과 같습니다.
  • ASIC 프로젝트의 약 72%
  • FPGA 종목 중 약 48%
  • 모습
    진짜야!?FPGA만 만지지만 그런 UVM이 유행한다는 인상은 없어요.Qiita를 필두로 투덜거려도 UVM을 일본어로 잘 처리할 수 있는 사이트는 발견되지 않았다.
    조사 대상에 편차가 있는 것 같지만 아무래도 세계적인 기준이라고 볼 수 있겠죠.
    내가 UVM을 배우는 이유는 스스로 테스트 라이브러리를 만드는 것이 매우 번거롭기 때문이다.자기 환경을 만들어도 남은커녕 미래의 자기도 이해 못 해.

    config_db와의 해후


    그럼 본론입니다.다음 설명은 UVM 자습서에 나와 있습니다.
    test.sv
    uvm_config_db#(virtual xxx_if)::set(null, "*", "vif", vif);
    uvm_config_db#(virtual xxx_if)::get(this, "", "vif", vif);
    
    다음은 다음 설명입니다.
    "Uvm config db는 UVM에 내장된 데이터베이스로 매우 편리합니다. 여기에 데이터를 등록하면 (Uvm 범위에서) 어디서든 데이터를 참조할 수 있습니다."
    아니야, 아니야, 편하다고 해도...
    네 개의 파라미터가 있는데 구조를 몰라서 w를 난처하게 한다
    이것은 나의 최초의 소감, 이번 제목이다.이 의문은 한동안 지속되었다.UVM을 사용하면서 마침내 이해하게 됐기 때문에 내 방식대로 설명하고 싶었다.

    언제 써요?


    언제db로 하면 돼요?튜토리얼 보는 느낌, 조용히 따라하는 느낌 w
    이렇게 말하지만 처음에는 입을 열기가 어려워서 용례를 소개해 드리겠습니다.
    내 인상일 뿐이지만 UVM(SystemeVerilog)의 세계를 현실 세계에 비유하면 다음과 같이 된다.

    현실 세계
    UVM의 세계
    사설 IC
    테스트 모듈
    평가 기판
    테스트 벤치
    연결 부호
    SystemVerilog의 인터페이스
    측량기
    테스트 클래스
    어떤 전용 IC를 테스트하기 위해 평가 기판을 가동하는 모습을 상상했다.
    기판 디자인과 IC 디자인은 반드시 다른 사람이 책임져야겠죠.
    여기서 나는 기판 설계자의 입장에서 생각해 보겠다.
    "IC 설계자가 말하므로 베이스보드에 커넥터를 구성했습니다.
    IC한테 어떤 시험을 봐요?
    IC 디자이너한테 물어봐.
    이곳의 회로 설계와 예술 작업은 매우 고생스럽다."
    UVM의 세계에서도 마찬가지입니다.
    테스트 벤치는 정적 요인이기 때문에 동적 요인인 테스트반을 고려하는 것은 어렵다.테스트 벤치에 인터페이스가 준비되면 테스트반이 맡는다.따라서 시험실과 시험반 사이에interface교량을 가설하는 기구가 필요하다.
    여기는 config입니다.그러니까 db가 나왔어!
    나 는 시험용 벤치 를 준비했으니, 먼저 인터페이스 를 열어 주시오db에 등록합니다.그리고 테스트반을 만들 때 관심있는interface config를db에서 끌어와.기타 config비록db의 활용 방법이 있지만, 나는 이것이 가장 간단한 사용 방법이라고 생각한다.

    어떻게 써요?


    다음은 사용 방법에 대한 설명입니다.
    먼저 configdb의 구조는 다음과 같다.
    (공식적인 정보는 아니지만 공급업체의 자료를 참고했다)
    name
    scope
    type
    value
    conf1
    *
    int
    1
    conf2
    uvm_test_top.env.agent
    string
    test
    데이터베이스는 (name,scope,type,value)로 나열됩니다.
    등록된 레코드는 예입니다.그리고 다음 설명에서 apbif라는 interface(=ARM 주변 버스)를 사용합니다.
    apb_if.sv
    interface apb_if (input clk, input resetn);
     logic [31:0] addr;
     logic write;
     logic [31:0] wdata
     logic enable;
     logic [15:0] sel
     logic [31:0] rdata;
     logic slverr;
     logic ready;
    endinterface : apb_if
    

    레코드 등록


    데이터베이스에 기록을 등록하려면 다음과 같이 하십시오.
    tb_top.svh
    uvm_config_db#(virtual apb_if)::set(null, "*", "vif", vif);
    
    과장된 기술이네.나는 내가 곧 낙담한 것을 기억한다.
    뜻을 설명하는 말
    uvm_config_db#(virtual apb_if)::
    uvm_config_db류의 모든 함수는 정적입니다.매개변수로 유형을 지정해야 합니다.
    set(null, "*", "vif", vif)
    첫 번째 파라미터와 두 번째 파라미터는 작용역이다.이번에는 작용역을 설정하지 않은 상황에서 기술한 것이다.역할 영역을 설정할 때 뒤에 서술합니다.
    세 번째 파라미터는config입니다위의 이름.
    네 번째 매개변수는 값입니다.매개변수 지정 유형의 값을 입력하십시오.
    또한 이번 예에서 세 번째 파라미터와 네 번째 파라미터의 문자열은 같지만 일치할 필요가 없다.
    실행하면 데이터베이스가 업데이트됩니다.
    name
    scope
    type
    value
    conf1
    *
    int
    1
    conf2
    uvm_test_top.env.agent
    string
    test
    vif
    *
    virtual apb_if
    /tb_top/vif

    레코드 참조


    방금 등록한 기록을 참조하면 다음과 같다.
    tb_top.v
    virtual apb_if vif;
    uvm_config_db#(virtual apb_if)::get(null, "*", "vif", vif);
    
    get()의 매개 변수는 set()와 같습니다.
    get()이 성공하면 변수 vif를 통해 방금 등록한interface에 접근할 수 있습니다.
    하면, 만약, 만약...만약db에 검색 조건에 맞는 기록이 없다면 get () 의 결과는 실패로 끝납니다.이 때 가짜는 되돌아오는 값으로 되돌아오기 때문에 일부 오류 처리가 필요합니다.

    역할 영역 정보


    uvm 테스트 단계를 기반으로 작용역을 설정할 수 있습니다.
    예: uvm-test_한 단계가 1이라고 가정해 보세요.env에서 볼 때 에이전트 1을 대상으로 하는 데이터를 등록할 때 다음과 같다.
    env.svh
    uvm_config_db#(int)::set(this, "agent1", "conf_agent1", 10);
    
    config_아래와 같이 db를 업데이트합니다.
    name
    scope
    type
    value
    conf1
    *
    int
    1
    conf2
    uvm_test_top.env.agent
    string
    test
    vif
    *
    virtual apb_if
    /tb_top/vif
    conf_agent1
    uvm_test_top.env.agent1
    int
    10
    scope열이'uvm test top.env.agent1'이 된 것은 주목이다.
    set()의 첫 번째 매개변수로 지정된 this가 uvm test top.env로 변환됩니다.System Verilog의 키워드입니다.그리고 set ()의 두 번째 인자 '에이전트 1' 을 조합한 문자열을 scope 열에 넣습니다.
    이것은 set()의 첫 번째 파라미터와 두 번째 파라미터가 기능상의 차이가 없다는 것을 의미한다.상하문(제1파라미터)과 실례(제2파라미터)로 나뉘어진다고 하면 프로그램에서 이해하기 쉽다.
    agent1에서 이 데이터를 인용하려면 다음과 같이 하십시오.
    agent1.svh
    int conf_agent1;
    uvm_config_db#(int)::get(this, "", "conf_agent1", conf_agent1);
    

    유형 정보


    name와scope가 같더라도 type이 다르면 다른 음반으로 처리됩니다.
    예: asbif(ARM 시스템 버스)가 있으면 다음과 같이 등록할 수 있습니다.
    name
    scope
    type
    value
    conf1
    *
    int
    1
    conf2
    uvm_test_top.env.agent
    string
    test
    vif
    *
    virtual apb_if
    /tb_top/vif
    conf_agent1
    uvm_test_top.env.agent1
    int
    10
    vif
    *
    virtual asb_if
    /tb_top/vif

    디버깅


    제가 사용법을 간단히 소개했는데 이해하려면 실제 접촉이 가장 좋습니다.
    마지막으로 디버깅 방법을 소개하겠습니다. 저는 끝내고 싶습니다.
    방법1
    소스 코드는 다음과 같습니다.
    debug.svh
    uvm_config_db_options::turn_on_tracing();
    
    방법2
    시뮬레이터의 옵션을 사용하여 +UVM CONFIG DB TRACE를 지정합니다.
    결과는 모두 같다,configdb에 조작할 때마다 아날로그에 로그를 표시합니다.
    #UVM_INFO C:/intelFPGA_lite/18.1/modelsim_ase/verilog_src/uvm-1.2/src/base/uvm_resource_db.svh(121) @ 0: reporter [CFGDB/SET] Configuration '*.conf1' (type int) set by  = (int) 1
    #UVM_INFO C:/intelFPGA_lite/18.1/modelsim_ase/verilog_src/uvm-1.2/src/base/uvm_resource_db.svh(121) @ 0: reporter [CFGDB/SET] Configuration '*.conf1' (type string) set by  = (string) test
    
    그게 다야.

    좋은 웹페이지 즐겨찾기