Verilog では以下のように always の中に assign 文を入れることが出来るらしい(@ryos36さんのTwitterから).
always 文の中に assign を入れる構文は Procedural-continuous assignments (手続き文の継続的代入?)と呼ぶらしく,DesignCompiler では「Procedural-continuous assignments は合成できないよ」とエラーが出た.純粋に動作モデルを立てるために使うのだろう.
- #!/bin/perl
- open (IN,"$ARGV[0]");
- @INA=<IN>;
- @DATAA;
- # find wires connecterd to DFF
- for(my $i=0;$i<scalar(@INA);$i++){
- if($INA[$i] =~ /\.DATA/) {
- @sparray = split(/\s+/,$INA[$i]);
- for(my $k=0;$k<=$#sparray;$k++){
- if($sparray[$k] eq "\.DATA") {
- push (@DATAA, $sparray[$k+2]);
- }
- }
- }
- if($INA[$i] =~ /\.Q/) {
- @sparray = split(/\s+/,$INA[$i]);
- for(my $k=0;$k<=$#sparray;$k++){
- if($sparray[$k] eq "\.Q") {
- push (@DATAA, $sparray[$k+2]);
- }
- }
- }
- }
- # print force
- for(my $i=0;$i<=$#DATAA;$i++){
- printf("force TOP.$DATAA[$i]=0;\n");
- }
- printf("\#10\n");
- for(my $i=0;$i<=$#DATAA;$i++){
- printf("release TOP.$DATAA[$i];\n");
- }
- module tb();
- reg CLK;
- wire OUT;
- always begin
- #5 CLK <= ~CLK;
- end
- // dut
- DIV INST_DIV(
- .CLK(CLK),
- .OUT(OUT)
- )
- initial begin
- CLK <= 1;
- force INST_DIV.invout=1;
- #10
- release INST_DIV.invout;
- end
- endmodule
- module DIV(
- .CLK,
- .OUT
- );
- input CLK;
- output OUT;
- wire invout;
- inverter(.A(OUT), .YB(invout));
- dff(.CLK(CLK), .DATA(invout), .Y(OUT));
- endmodule