Verilog根据输入强制执行不同的导线

时间:2012-07-11 16:52:16

标签: variables task verilog modular

有没有办法在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任务,但是我怎么能告诉模拟器哪个导线驱动高而不必每次在任务本身写出每一根电线?

如果我能做到这一点,那么正确的做法是什么? 如果我不能这样做,你可以建议一下吗?

2 个答案:

答案 0 :(得分:2)

很可能有一种PLI / VPI方法可以做到这一点,但我对它并不是很有经验,所以请耐心等待。我也没有意识到verilog中的任何反射要么将字符串变成线参考。

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

您可以进行类似force_wire(int wireId),release_wire(int wireId)的PLI调用,其中wire 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

答案 1 :(得分:1)

可悲的是,不,你不能做你正在尝试使用非PLI Verilog结构的东西。力的目标需要是网络的分层路径,并且没有办法使用字符串。

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

如果你想使用PLI,你应该能够编写一个能够接受字符串并强制执行的函数。我想暂时做类似的事情,但还没有尝试过。如果你找到更好的方法,请在这里回答你自己的问题。

编辑:Here is a discussion使用PLI或SystemVerilog绑定进行一些可能的实现。