Сбой поиска компонента иерархического имени в systemverilog - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь изучить случай, ссылаясь на https://verificationacademy.com/courses/systemverilog-oop-for-uvm-verification

Чтобы понять '$ cast', я реализовал следующее:

class A;
    int v=1;
endclass

class F extends A;
    int w=2;
endclass

class B extends A;
    int x=3;
endclass

class G extends B;
    int y=4;
endclass

class C extends B;
    int z=5;
endclass



module test;
initial begin
    A a_h = new();
    B b_h;
    G g_h;
    C c_h;
    F f_h;
    $display(a_h.v);
    if ( $cast(c_h, a_h) )
        $display(c_h.z);
    else if ( $cast(g_h, a_h) )
        $display(g_h.y);
end
endmodule

Но у меня естьтолько только

'1'

Я думаю, что приведенный ниже код не работает.

 if ( $cast(c_h, a_h) )
        $display(c_h.z);
    else if ( $cast(g_h, a_h) )
        $display(g_h.y);

Не могли бы вы помочь мне с тем, что в нем произошла ошибка при поиске компонента иерархического имени?

обновление 2

Если я хочу привести G к классу А, что я должен делать?

кастинг

I 'При реализации я получил сообщение об ошибке, как показано ниже

module test;

B b_h = new();
G g_h = new();
C c_h = new();
F f_h = new();
A a_h = new();

initial begin

$cast(c_h, a_h);
$display(c_h.z);
$display(b_h.x);
$display(a_h.v);

Сообщения об ошибках

    $cast(c_h, a_h);
            |
ncsim: *E,BCLCST (./test1.sv,33|5): Invalid cast: a value with the class datatype '$unit_0x118af7fb::A' cannot be assigned to a class variable with the datatype '$unit_0x118af7fb::C'.
          5
          3
          1

Как видите, у меня есть 5, 3, 1 значения, но также и сообщение об ошибке,Пожалуйста, дайте мне знать, почему я получаю это сообщение об ошибке?

1 Ответ

0 голосов
/ 09 октября 2018

Для того, чтобы выполнить это приведение, вы должны сначала выделить класс derived, а затем использовать его как класс base, и только тогда вы можете выполнять приведение, как в следующем примере.

class A;
  int a = 1;
endclass
class B extends A;
  int b = 2;
endclass

module C;
  B b_h = new(); // << allocate the derived class
  B bb_h;
  A ba_h;

  initial begin
    ba_h = b_h;  // << assign derived class to the base

    if ($cast(bb_h, ba_h)) // << now you can cast base to another variable of class B (or to one of its bases).
      $display(bb_h.b);
  end
endmodule
...