我们正在尝试通过我们正在使用的命令行工具构建一个包装脚本。我们想根据包装脚本中的选项设置一些工具参数。我们还希望有可能将原生参数直接传递给命令行工具,因为它们是在命令行上编写的。
这是我们想出的:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('positional')
parser.add_argument('-f', '--foo', action='store_true')
parser.add_argument('-b', '--bar', action='store_true')
parser.add_argument('native_arg', nargs='*')
args = parser.parse_args()
print (args)
Run Code Online (Sandbox Code Playgroud)
positional是强制性的。基于这些选项-f,-b我们会向我们的工具调用添加一些额外的选项。之后留下的任何东西(如果有的话)都应该被视为本机工具参数并直接提供给工具。调用我们的脚本-h产生以下用法:
usage: test.py [-h] [-f] [-b] positional [native_arg [native_arg ...]]
Run Code Online (Sandbox Code Playgroud)
诀窍是这些本机参数本身就是该工具的选项,并包含前导破折号,例如-native0和-native1。我们已经知道使用双破折号来阻止argparse寻找更多选项的技巧。以下调用:
./test.py pos -- -native0 -native1
Run Code Online (Sandbox Code Playgroud)
产生预期的解析参数:
Namespace(bar=False, foo=False, native_arg=['-native0', '-native1'], positional='pos')
Run Code Online (Sandbox Code Playgroud)
但是,尝试在第一个位置参数后添加选项不起作用。更具体地说,以下调用:
./test.py pos --foo -- -native0 -native1
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
usage: [...shortened...]
test.py: error: unrecognized arguments: -- -native0 -native1
Run Code Online (Sandbox Code Playgroud)
将可选参数放在位置之前:
./test.py --foo pos -- -native0 -native1 …Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能以某种方式弄清楚是否错误地在UVM驱动程序内部开发人员写入DUT输出信号而不是输入信号.我试过这个,没有编译/运行时错误消息.示例在这里(尝试在我的机器上的Incisive中完成,代码稍后上传):
http://www.edaplayground.com/x/386
'some_signal'上的赋值模拟DUT输出(连续驱动程序).每当我尝试从类中驱动'some_signal'表示信号被多次驱动时,我会预料到运行时错误,但是类驱动程序"获胜"并更新信号.
前段时间,当我刚刚开始做SV时,我玩modports.我会在modport中声明一些信号作为输入,但我注意到驱动它们仍然是合法的.之后我不再使用它们了.显然这是众所周知的,正如这篇文章所说:https://verificationacademy.com/forums/systemverilog/modports-sv
我最近从同事那里继承了一些在类中使用modport的代码.我做了以下示例来说明该代码正在做什么:
http://www.edaplayground.com/x/2W_
我尝试在两个类中使用modport,但ModelSim抱怨不应该在分层路径中使用modport.敏锐的代码没有问题,也没有发出任何警告.ModelSim错误以及2012年标准中的引用"为了限制模块内的接口访问,存在在接口内声明了方向的modport列表." 有点暗示modport并不是真的打算在课堂上使用.
有人可以确认modports不是去这里的方法吗?此外,有没有人知道这些错误(从类驱动DUT输出)是否可以以任何方式被捕获?
我试图基于其他一些对象约束整个对象(而不仅仅是对象的字段).这是我的生产代码的精简版:
我有以下课程:
class some_class;
bit[7:0] some_field;
bit[3:0] some_other_field;
// this function would do some complex procedural
// operations on the fields of the object
function void do_some_op();
bit[3:0] tmp = some_field[3:0];
some_field[3:0] = some_other_field;
some_other_field = some_field[7:4];
some_field[7:4] = tmp;
endfunction
function some_class some_function(bit some_param);
some_function = new this;
$display("foo"); // this print here to see that method is executed
if (some_param)
some_function.do_some_op();
endfunction
function void print();
$display("some_field = %x", some_field);
$display("some_other_field = %x", some_other_field);
endfunction
endclass // some_class
Run Code Online (Sandbox Code Playgroud)
该类包含一些整数字段.它还有一个方法,可以在该类的字段上执行一些复杂的过程.在示例中,我简化了它.我还有另一个类,它返回一个已在其上执行操作的新对象. …
我正在开发一个使用 Oracle 作为后端的旧 PHP Web 应用程序。我没有直接访问这个数据库的权限。
在旧应用程序中,他们使用str_replaces 而不是oci_bind_by_name替换 sql 上的变量。我想改变这一点,但我想这样做,同时避免破坏某些东西。所以我在执行sql之前写了一些测试。
我想将旧生成的 sql 与使用后生成的 sql 进行比较,oci_bind_by_name但我找不到查看“绑定”sql 的方法。
有这样的方法吗?
我尝试了一些代码,应该阻止,直到移动到一个新的模拟时间步长(类似于等待sys.tick_start在ë).
我尝试编写一个执行此操作的函数:
task wait_triggered();
event e;
`uvm_info("DBG", "Waiting trig", UVM_NONE)
-> e;
$display("e.triggered = ", e.triggered);
wait (!e.triggered);
`uvm_info("DBG", "Wait trig done", UVM_NONE)
endtask
Run Code Online (Sandbox Code Playgroud)
它背后的想法是我触发一些事件,这意味着triggered当控制到达线时,它的字段将变为1 wait(!e.triggered).该行应在下一个时隙中解除阻塞,何时triggered将被清除.
为了测试这个,我添加了一些消耗模拟时间的其他线程:
fork
wait_triggered();
begin
`uvm_info("DBG", "Doing stuff", UVM_NONE)
#1;
`uvm_info("DBG", "Did stuff", UVM_NONE)
end
join
#1;
$finish(1);
Run Code Online (Sandbox Code Playgroud)
我看到消息做东西和做过的东西,但Wait trig done永远不会到来.模拟也在到达之前停止finish(1).一位模拟器告诉我,这是因为没有安排其他事件.
所有模拟器都表现出相同的行为,因此必须有一些我缺少的东西.谁能解释一下发生了什么?
在Systemverilog/UVM中使用正则表达式需要调用哪些函数?
注意:我不是问如何使用正则表达式,只是方法名称.
我有一个Perl脚本,system()按顺序使用该函数启动某些程序.当脚本正在运行并且程序正在运行时,我输入CTRL + C.我希望程序终止(发生),但我也希望脚本终止(这不会发生).
我已经建立了一个最小的工作示例.这是Perl脚本:
#!/bin/env perl
sub run_the_test {
local($name, $_) = @_;
print "Starting $name\n";
return system("program.bash $name");
}
&run_the_test("test1");
&run_the_test("test2");
&run_the_test("test3");
Run Code Online (Sandbox Code Playgroud)
这是外部的"程序":
#!/bin/env bash
echo "Started $1"
sleep 3
echo "Finished $1"
Run Code Online (Sandbox Code Playgroud)
我启动了脚本并发出了CTRL + Z.然后我做了一个ps -o pid,pgrp,cmd列出进程信息.我可以看到脚本,它调用的bash shell和sleep命令都属于同一个进程组.在sleep执行时我也希望它是前台进程组.我在Linux,信号和终端上读了一下,发现CTRL + C应该向整个前台进程组发送一个中断,从而也终止了脚本.
我也试过用exec()而不是system().这样,脚本在触发CTRL + C时会停止,但它不会运行在test1之后.
任何人都可以了解这里发生的事情吗?