Эффективность, вероятно, не имеет большого значения.Без лучшего понимания вашей ситуации сложно дать твердый совет, но я рекомендую вызов $ pli, как в вашем примере.Использование cbValueChange означает регистрацию некоторого кода на C, который будет выполняться симулятором при изменении значения переменной.Это происходит без вызова пользовательской процедуры $ pli во время изменения значения.Поскольку это абсолютно невидимо для любого, кто читает код Verilog, вы расстроите любого, кто попытается понять, что происходит, если ваш код на C вносит какие-либо изменения, влияющие на симуляцию.