2

有没有办法在 Verilog 任务中强制任意线为某个值,而无需提前指定线的名称或其分层路径?最好不必为每条可能的线路编写大量的 if 语句。

我的目标是足够模块化,以便从测试台的角度来看,这个任务可以用来驱动任何电线。

我希望做的例子:

task force;
input value;
input [8*N-1:0] string;              // Assume N is large enough
begin
    force ... = value;
end
endtask

其中三个点“...”将是传入的电线的路径(例如 counter0.clk0.in_enable)。

假设我有 64 根电线,我想将其中的一些强行加高。它们不在单个总线上,它们都有不同的名称或分层路径。在测试台设置中,我会编写一个 C 函数,它读取我关心驱动到某个值的电线表并将每条电线传递给这个 Verilog 任务,但是我如何告诉模拟器哪条电线驱动高而不必每次在任务本身中写出每一根线?

如果我能做到这一点,那么正确的方法是什么?如果我不能这样做,你有什么建议呢?

4

2 回答 2

2

很可能有一种 PLI/VPI 方法可以做到这一点,但我对它不是很有经验,所以对此持保留态度。我也不知道verilog中有任何反射将字符串转换为线参考。

话虽如此,我要做的只是使用脚本语言来读取您的表格,然后吐出一个带有巨大案例语句的程序生成的 .v 文件。

你可以有一个像 force_wire(int wireId), release_wire(int wireId) 这样的 PLI 调用,其中线 ID 可能只是表格的行或其他东西。

在 C 例程中,您可以从字符串名称中查找 id,然后这将使用 id 调用 verilog 任务,并且 id 将从生成的 case 语句中选择要强制执行的内容。也许是这样的:

task force
input forceVal;
input wireId
begin
   case (wireId)
   //AUTOGENERATED BELOW
   0 : force foo.bar = forceVal;
   1 : force foo.baz = forceVal;
   2 : force bar.foo = forceVal;
   ...
   endcase
end
于 2012-07-11T19:16:56.873 回答
1

可悲的是,不,您无法使用非 PLI Verilog 构造来尝试执行您正在尝试的操作。力的目标需要是网络的层次路径,没有办法为它使用字符串。

Tim 在另一个答案中的建议,基本上是创建一个大查找表,可能是不使用 Verilog PLI 的最佳方法。

如果您想使用 PLI,您应该能够编写一个接收字符串并执行强制的函数。我想做类似的事情已经有一段时间了,但一直没有时间去尝试。如果您找到更好的方法,请在此处回答您自己的问题。

编辑:这是使用 PLI 或 SystemVerilog 绑定的一些可能实现的讨论。

于 2012-07-11T20:32:45.687 回答