質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Verilog

Verilogは、デジタル回路設計用の論理シミュレータ。また、ハードウェアの電子回路設計の際に用いるハードウェア記述言語を指すこともあります。両者を見分けるために、言語を「Verilog-HDL」と呼ぶ場合もあります。

Q&A

解決済

2回答

3635閲覧

verilogでmoduleをインスタンス化した時にSyntax Error

ijuya_yika

総合スコア50

Verilog

Verilogは、デジタル回路設計用の論理シミュレータ。また、ハードウェアの電子回路設計の際に用いるハードウェア記述言語を指すこともあります。両者を見分けるために、言語を「Verilog-HDL」と呼ぶ場合もあります。

0グッド

0クリップ

投稿2018/04/27 21:00

編集2018/04/27 21:21

前提・実現したいこと

以下のベリログのコードでdecodeというmoduleをインスタンス化した時にエラーになるのですが何が原因なのでしょうか?
decodeモジュールでは16bitinstr1r2に分けるという動作をしたいです


調べた所always@の中にモジュールのインスタンス化をするとエラーが起きるそうなので、alwaysの外に移動してみたのですが、今度はPort 1 (inst) of decode expects 1 bits, got 16.というエラーに遭遇しました。 

発生している問題・エラーメッセージ

syntax error

該当のソースコード

Verilog

1`define WORD [15:0] 2`define MEMORY [65536-1:0] 3 4 5module Processor(reset, clock); 6 input reset, clock; 7 reg `WORD pc; 8 reg `WORD inst; 9 10 reg `WORD instructions `MEMORY; 11 12 wire `WORD r1; 13 wire `WORD r2; 14 15 decode d( inst, r1, r2 ); 16 always @(posedge clock) begin 17 pc = pc + 1; 18 inst = instructions[pc]; 19 20 21 $display("reg1 %d\t reg2 %d\n", r1, r2); 22 $display("pc = %d\n", pc); 23 $display("instuctions[pc] = %x\n", instructions[pc]); 24 end 25 26 27 28 29 always @(reset) begin 30 pc = 0; 31 $readmemh0(instructions, 0, 65535); 32 end 33 34 35endmodule 36 37module decode(inst, r1, r2); 38 input `WORD inst; 39 output [7:0] r1, r2; 40 41 r1 = inst[15:8]; 42 r2 = inst[7:0]; 43endmodule 44 45 46 47module testbench; 48 49 reg clock; 50 reg reset; 51 wire halt; 52 53 Processor proc(.clock(clock), .reset(reset)); 54 55 initial begin 56 reset <= 1; 57 #1; 58 reset <= 0; 59 #1; 60 repeat (1<<15) begin 61 clock <= 1; 62 #1; 63 clock <= 0; 64 #1; 65 end 66 end 67endmodule 68

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

インスタンスは永続的に存在するもので、always の中には、clock のedgeが変化したときの動作を記述します。clockの変化によってインスタンスが消えたり生成されたりを繰り返すわけではないので、alwaysの中でインスタンス化を宣言することはできません。
インスタンスの機能、この例では、16bitを分解する動作は、インスタンスの内部でclockの変化に伴う動作として定義ます。
その部分だけを短く書けば、
インスタンス化部分..

decode d(..) ; always @(posedge clock) ..

decodeでの動作定義

module decode(clock,..) ; always @(posedge clock) ..

全体としては以下のように直しました。
気に入ったら解決済、best answerお願いしますね。

`timescale 1ns / 1ns `define WORD 16 //`define MEMORY 65536 `define MEMORY 32 module Processor(reset, clock,r1,r2); input reset, clock; output [`WORD/2-1:0] r1, r2 ; reg [`WORD-1:0] pc,inst ; reg [`WORD-1:0] instructions [`MEMORY-1:0]; //wire [`WORD-1:0] r1,r2 ; decode d(.clock(clock),.inst(inst), .r1(r1), .r2(r2)); always @(posedge clock) pc <= (reset)?16'h0:(pc+1) ; always @(posedge clock) inst = instructions[pc]; initial $readmemh0(instructions, 0, `MEMORY); endmodule module decode(clock,inst, r1, r2); input clock ; input [`WORD-1:0] inst; output reg [`WORD/2-1:0] r1, r2; // reg [`WORD/2-1:0] r1,r2 ; // always @(posedge clock) {r1,r2} <= inst ; always @(posedge clock) r1 <= inst[`WORD-1:`WORD/2]; always @(posedge clock) r2 <= inst[`WORD/2-1:0]; endmodule module testbench; reg clock; initial clock = 0 ; always clock = #1 ~clock ; reg reset; initial begin #0 ;reset = 0 ; #1 ;reset = 1 ; end wire [`WORD/2-1:0] r1, r2 ; Processor proc(.clock(clock), .reset(reset), .r1(r1),.r2(r2)); endmodule // testbench

投稿2018/04/28 00:33

gm300

総合スコア580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ijuya_yika

2018/04/28 17:12

コメントありがとうございます。 r1, r2がtestbenchでnet型で定義されてますがregのままだとなぜいけないのでしょうか? あとprocessor内でwireとして定義しても良いのでしょうか?
gm300

2018/04/29 00:50

regにできます。 別のレジスタのインスタンスになります。従って、decode のr1をtestbenchのr1に代入する動作を記述する必要があります。  test benchで、 wire [`WORD/2-1:0] r1_tmp ; Processor proc(...,.r1(r1_tmp)); always @(posedge clock) r1 <= r1_temp ; 1つのr1をdecode階層とtestbench階層で2回インスタンス化することはできません。1つのインスタンスを異なる階層(同じ階層でも)で別名/alias的または、union 的に命名することは文法的に考慮されていません。 レジスタインスタンスを使わない実装もあります。その場合、配線だけで、clockに合わせて代入するべきレジスタがないし、clockに関係なくつねにdecodeされるので、wire だけで、always は不要になります。例えば、  wire [`WORD/2-1:0] r1,r2 ; assign {r1,r2} = inst ; ... 配線には、別名をつけることがどれだけでもできます。
guest

0

書籍「Verilog‐HDLによる論理合成の基礎―合成に向いたコーディングを考える」を参考にしてみましょう。verilogの文法の中で、普通に必要な部分がわかりやすく説明されています。

投稿2018/04/29 00:32

gm300

総合スコア580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問