zoukankan      html  css  js  c++  java
  • 【方案解决】ncelab: *E,CUIOCP Outofmodule reference terminating in a VHDL scope is not allowed

    Error Message

     

    ncelab: *E,CUIOCP Out-of-module reference terminating in a VHDL scope is not allowed

    Definition

     

    This solution addresses the following points regarding accessing internal signals between Verilog and VHDL domains :

     

    Q1:The ncelab error CUIOCP as shown above :

     

    Scenario :

    I have a mixed language design : RTL in VHDL, instantiated in verilog testbench.

    I need to refer to an internal signal of VHDL code. How can I reference this from my verilog top-level ?

     

    The code snippet below gives elaboration error CUIOCP:

    ***

    initial

    begin

    var_a = 1'b0;

    @(posedge top.m10.v1.inst_btm.r_io);

    var_a = 1'b1

    end

    ***

    top : Verilog top

    m10: vhdl instantiation in verilog

    v1: verilog instantiation in vhdl

    inst_btm: vhdl instantiation in verilog

    r_io: vhdl signal

     

    The above code compiles properly but it gives elaboration error CUIOCP.

     

    Q2-1: How to access a signal deep down the hierarchy from the top level when the design is Mixed HDL (Verilog-VHDL-Verilog)

     

    Q2-2: How to access a signal deep down the hierarchy from the top level when the design is Mixed HDL (VHDL-Verilog-VHDL)

     

    Q3:Case sensitivity in the nc_mirror path for Verilog and VHDL

    Solution

     

     

    A1: Resolving the ncelab error CUIOCP :

     

    Mixed language OOMRs (out-of-module reference) have a restriction that they cannot end in a VHDL scope, as can be seen in the extended help for the error code CUIOCP.

     

    :> nchelp ncelab CUIOCP

    ncelab/CUIOCP =

    The out-of-module reference specified terminates in a VHDL scope. Access

    of a VHDL object through out-of-module reference mechanism is not allowed

    in mixed language hierarchies.

     

    You can work around this OOMR restriction using the $nc_mirror task in the top Verilog testbench as :

    *****

    reg var_a;

    reg mirror_signal;

    initial $nc_mirror( "mirror_signal", "top.m10:v1.inst_btm:r_io", "verbose");

    initial

    begin

    var_a = 1'b0;

    @(posedge mirror_signal)

    var_a = 1'b1 ;

    end

    ******

     

    Another solution could be to instantiate a dummy Verilog block inside the target VHDL block which either takes in or drives out signals to the higher-level block. This would create a Verilog unit forthe VerilogOOMR's to use as termination object. Here is example code snippet.

    entity vhdl_bot

    signal vhdl_bot : std_logic;

    component verilog_hack

    port (hack : in std_logic); end component;

    inst_hack :verilog_hack port map (vhdl_bot) ;

    module verilog_hack(hack);

    input hack;

    endmodule

    Since the signal vhdl_bot is now connected in Verilog bottom, it can be directly accessed from anywhere.

    NOTE A1-1: Attached with this solution is an example testcase that shows the usage of nc_mirror.

     

    NOTE A1-2: Please refer to the Verilog Simulation User Guide or VHDL Simulation User guide - Chapter "Applications"

    for the syntax details of $nc_mirror system task (Verilog) and nc_mirror procedure (VHDL), along with examples of usage.

     

    A2-1: Attached with this solution is a testcase example that illustrates the use of $nc_mirror system task in a mixed-language hierarchy with Verilog as the top-level.

    Testcase : nc_mirror_top_vlog.tar.gz

     

    A2-2: Attached with this solution is a testcase example that illustrates the use of nc_mirror procedure in a mixed-language hierarchy with VHDL as the top-level.

    Testcase : nc_mirror_top_vhd.tar.gz

     

    A3: Case sensitivity in the nc_mirror path for Verilog and VHDL :

     

    It is important to note that the path for nc_mirror is case insensitive for VHDL names and is case sensitive for Verilog names.

     

    That is, if the original nc_mirror calls are as follows :

     

    VHDL: nc_mirror(":mirror_signal", ":v1.inst_btm:r_io", "verbose"); --ORIGINAL

    Verilog: $nc_mirror( "temp","g1:Forloop1[3].instant1.D_in","verbose"); // ORIGINAL

     

    The following would also work as the VHDL names are case insensitive:

     

    VHDL: nc_mirror(":mirror_signal", ":V1.inst_btm:R_io", "verbose"); -- 'v1' and 'r_io' VHDL case insensitive

    Verilog: $nc_mirror( "temp","g1:fORLoop1[3].instant1.D_in","verbose"); // 'Forloop1' VHDL case-insensitive

     

    However, the following would *not* work as the Verilog names are case sensitive :

     

    VHDL: nc_mirror(":mirror_signal", ":v1.INST_BTM:r_io", "verbose"); -- 'inst_btm' Verilog case sensitive

    Verilog: $nc_mirror( "temp","G1:Forloop1[3].instant1.D_in","verbose"); // 'g1' Verilog case-sensitive

     

    This is also illustrated in the two testcases attached to this solution.

     

    In order to change values of signals, use nc_force or nc_deposit utilities as described in the Simulation User Guides.

     

    NOTE: It is the convention to use the different hierarchy separators for mixed language, '.' preceding Verilog units and ':' preceding VHDL units. ncsim does not enforce using the different separators however.

  • 相关阅读:
    20180925-2 功能测试
    【PL/SQL编程】循环语句
    【PL/SQL编程】条件语句
    【PL/SQL编程】变量和常量
    【PL/SQL编程】数据类型说明
    【PL/SQL编程】注释说明
    【PL/SQL编程】SQL与PL/SQL的区别
    【SQL查询】查询结果翻译成其他值_decode
    【SQL查询】日期的转换_to_date/to_char
    【SQL查询】视图_view
  • 原文地址:https://www.cnblogs.com/nanoty/p/2960461.html
Copyright © 2011-2022 走看看