您好Stack_overflow专家!
我想创建一个同时包含有效perl代码和有效verilog代码的文件。实际的verilog和perl功能根本不需要相关。像这样的东西的标准术语是polyglot program,但我找不到verilog + perl的例子。我知道将它作为2个单独的文件可能是一个更好的主意,但在这种情况下,将相关内容放在同一个文件中会很好。我也很好奇,知道这是否可行。
这就是我想要的东西:
$THIS_IS_VERILOG_CODE = <<'_THIS_IS_VERILOG_CODE_';
module my_and_gate #(parameter WIDTH=1) (a,b,z);
input [WIDTH-1:0] a,b;
output [WIDTH-1:0] z;
assign z = a & b;
endmodule
_THIS_IS_VERILOG_CODE_
`ifdef _THIS_IS_PERL_CODE_
sub print_instance {
my ($a, $b, $z, $i, $width) = @_;
print "my_and_gate and$i #(.WIDTH($width)) (.a($a), .b($b), .z($z));\n";
}
&print_instance(first, second, both, 5, 3);
`endif // _THIS_IS_PERL_CODE_
但是我无法弄清楚如何以不会弄乱相反语言的方式编写* THIS_IS *行。
更新: 可能值得一提的是,当以perl身份运行时,我希望该文件只生成perl代码的结果:
my_and_gate and5 #(.WIDTH(3)) (.a(first), .b(second), .z(both));
当解析为Verilog时,我希望它被解释为verilog部分:
module my_and_gate #(parameter WIDTH=1) (a,b,z);
input [WIDTH-1:0] a,b;
output [WIDTH-1:0] z;
assign z = a & b;
endmodule
谢谢!
答案 0 :(得分:7)
这并不能完全生成您想要的输出,但它是一个有效的Verilog和Perl代码:
首先需要创建一个新的perl包。让我们称之为perilog.pm:
package perilog;
use Filter::Simple;
FILTER {
s/`ifdef.*?`else//sg;
s/`endif//sg;
}
1;
然后你的perl / verilog代码可以是:
`ifdef _THIS_IS_VERILOG_
module test();
initial
$display("Hello from Verilog\n");
endmodule
`else
print ("Hello from perl\n");
`endif
解释:我在perl编译器中使用了source filter。 perilog包中的第一个过滤器隐藏了`ifdef 和`else 之间的内容。第二个过滤器隐藏`endif 。
perl编译器的命令行应该有-Mperilog
。
Verilog编译器的命令行应该有+define+_THIS_IS_VERILOG_
。