有没有一种方法可以在Verilog任务中强制任意连接到某个特定值,而不提前指定连接的名称或其分层路径?优选地,不必为每条可能的线路编写大量的if语句。
我的目标是足够模块化,以便这个任务可以用来从testbench的角度驱动任何连接。
下面是我希望做的例子:
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根线,我想把它们中的一些放高。它们不在一条总线上,它们都有不同的名称或分层路径。在testbench设置中,我将编写一个C函数,该函数读取我希望驱动到某个特定值的连接线的表,并将每个连接线传递给这个Verilog任务,但是我如何才能告诉模拟器将哪条连接线驱动为高电平,而不必每次都在任务本身中写出每一条连接线?
如果我能做到这一点,正确的方法是什么?如果我不能做到这一点,你能给我什么建议呢?
发布于 2012-07-11 19:16:57
很可能有一种PLI/VPI方法可以做到这一点,但我对此并不是很有经验,所以对此持保留态度。我在verilog中也没有注意到任何将字符串转换为线引用的反射。
话虽如此,我所要做的就是使用脚本语言读取您的表,并生成一个带有巨大case语句的过程化生成的.v文件。
你可以有一个像force_wire(int wireId),release_wire(int wireId)这样的PLI调用,其中的连接id可以是表中的行或者其他什么。
在C例程中,您可以从字符串name中查找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-11 20:32:46
遗憾的是,不能,您不能使用非PLI Verilog构造来做您正在尝试的事情。强制的目标需要是网络的分层路径,并且没有办法对其使用字符串。
Tim在另一个答案中的建议是,基本上创建一个大的查找表,这可能是不使用Verilog PLI的最好方法。
如果你想使用PLI,你应该能够写一个函数,它可以接收字符串并作用力。我想做类似的事情已经有一段时间了,但还没有抽出时间去尝试。如果你找到更好的方法,请在这里回答你自己的问题。
编辑:使用PLI或SystemVerilog绑定的一些可能的实现的Here is a discussion。
https://stackoverflow.com/questions/11437564
复制