Variables Verilog根据输入强制执行不同的连线任务

Variables Verilog根据输入强制执行不同的连线任务,variables,task,verilog,modular,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 其

有没有一种方法可以在Verilog任务中强制任意连接到某个值,而不提前指定连接的名称或层次路径?最好不必为每条可能的线路编写大量的if语句

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

我希望做的示例:

task force;
input value;
input [8*N-1:0] string;              // Assume N is large enough
begin
    force ... = value;
end
endtask
其中三个点“…”将是传入的导线的路径(例如计数器0.clk0.in_enable)

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

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

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

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

您可以有一个PLI调用,比如force_-wire(int-wireId)、release_-wire(int-wireId),其中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

遗憾的是,不,您无法使用非PLI Verilog构造完成您正在尝试的操作。原力的目标需要是网络的分层路径,并且无法使用字符串

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

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


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

我不清楚这个问题。如何在运行时确定要驱动哪些导线?可以定义使用VPI接口驱动导线的系统任务。我相信这很容易成为性能瓶颈。@Adam12来确定哪些导线:我得到了一个到所有需要驱动的导线的分层路径表。如果你的意思是我如何告诉模拟器驱动哪些电线,那么我不确定。事实上,这正是我想弄明白的。@RossRogers C到Verilog的接口已经设置好了。我的下一步是确定是否可以为导线创建一个占位符,我将在我的C函数中设置占位符,然后调用任务强制该导线处于高位或低位。编辑:基本上我的C函数调用是:callForce(“counter0.clk0.in_enable”,HIGH);callForce(“计数器1.clk0.in_enable”,低);等等…你真的想从C/C++世界强制或存储值吗?如果是这样的话,那么你可以像这样使用
vpi\u put\u value
我在PLI/vpi方面也不是很有经验,我也不太懂脚本!但仍在学习诀窍。谢谢我仍然想知道是否有人知道如何按照我最初打算的方式实现它,而不需要case或if语句。