小编Tud*_*imi的帖子

带有以破折号开头的可选位置参数的“argparse”

我们正在尝试通过我们正在使用的命令行工具构建一个包装脚本。我们想根据包装脚本中的选项设置一些工具参数。我们还希望有可能将原生参数直接传递给命令行工具,因为它们是在命令行上编写的。

这是我们想出的:

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)

python argparse

6
推荐指数
1
解决办法
3415
查看次数

限制对类中虚拟接口信号的访问

我想知道是否有可能以某种方式弄清楚是否错误地在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输出)是否可以以任何方式被捕获?

system-verilog uvm

5
推荐指数
1
解决办法
2488
查看次数

在SystemVerilog中约束整个对象

我试图基于其他一些对象约束整个对象(而不仅仅是对象的字段).这是我的生产代码的精简版:

我有以下课程:

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)

该类包含一些整数字段.它还有一个方法,可以在该类的字段上执行一些复杂的过程.在示例中,我简化了它.我还有另一个类,它返回一个已在其上执行操作的新对象. …

system-verilog

5
推荐指数
1
解决办法
1807
查看次数

oci_bind_by_name 之后有没有办法查看生成的sql?

我正在开发一个使用 Oracle 作为后端的旧 PHP Web 应用程序。我没有直接访问这个数据库的权限。

在旧应用程序中,他们使用str_replaces 而不是oci_bind_by_name替换 sql 上的变量。我想改变这一点,但我想这样做,同时避免破坏某些东西。所以我在执行sql之前写了一些测试。

我想将旧生成的 sql 与使用后生成的 sql 进行比较,oci_bind_by_name但我找不到查看“绑定”sql 的方法。

有这样的方法吗?

php sql oracle oracle-call-interface

5
推荐指数
0
解决办法
780
查看次数

关于event.triggered的使用的困惑

我尝试了一些代码,应该阻止,直到移动到一个新的模拟时间步长(类似于等待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).一位模拟器告诉我,这是因为没有安排其他事件.

所有模拟器都表现出相同的行为,因此必须有一些我缺少的东西.谁能解释一下发生了什么?

system-verilog

3
推荐指数
1
解决办法
932
查看次数

SV或UVM中的正则表达式

在Systemverilog/UVM中使用正则表达式需要调用哪些函数?

注意:我不是问如何使用正则表达式,只是方法名称.

system-verilog uvm

2
推荐指数
1
解决办法
2387
查看次数

CTRL + C和Perl的system()函数 - 脚本不会被中断

我有一个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之后.

任何人都可以了解这里发生的事情吗?

linux perl

2
推荐指数
1
解决办法
786
查看次数