您好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; output [WIDTH-1:0] z; assign z = a & b; endmodule
谢谢!
解决方法
这并不完全生成您想要的输出,但它是一个有效的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
说明:我使用了source filter作为perl编译器. perilog包中的第一个过滤器隐藏了`ifdef和`else之间的内容.第二个过滤器隐藏`endif.
perl编译器的命令行应该有-Mperilog.Verilog编译器的命令行应该定义_THIS_IS_VERILOG_.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。