微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > 微电子学习交流 > 请教verilog的问题

请教verilog的问题

时间:12-12 整理:3721RD 点击:
以下round-robin的写法有没有问题?(功能)
module rr (
           clk,
           rst_n,
           req,
           gnt
           );
input        clk;
input        rst_n;
input [3:0]  req;
output [3:0] gnt;
reg [3:0]  mask;
wire [7:0] sreq;
assign sreq = {req[3:0], req[3:0] & mask[3:0]} ;
always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        mask <= 4'b1111;
    end
    else if (gnt != 4'h0) begin
        case (1'b1)
            gnt[0] : mask <= 4'b1110 ;
            gnt[1] : mask <= 4'b1100 ;
            gnt[2] : mask <= 4'b1000 ;
            gnt[3] : mask <= 4'b0000 ;
            default: mask <= 4'b0000 ;
        endcase
    end
end
always @ (*) begin
    case (1'b1)
        sreq[0] : gnt = 4'b0001 ;
        sreq[1] : gnt = 4'b0010 ;
        sreq[2] : gnt = 4'b0100 ;
        sreq[3] : gnt = 4'b1000 ;
        sreq[4] : gnt = 4'b0001 ;
        sreq[5] : gnt = 4'b0010 ;
        sreq[6] : gnt = 4'b0100 ;
        sreq[7] : gnt = 4'b1000 ;
        default : gnt = 4'b0000 ;
    endcase
end
endmodule

always @ (*) begin
    case (1'b1)
        sreq[0] : gnt = 4'b0001 ;
        sreq[1] : gnt = 4'b0010 ;
        sreq[2] : gnt = 4'b0100 ;
        sreq[3] : gnt = 4'b1000 ;
        sreq[4] : gnt = 4'b0001 ;
        sreq[5] : gnt = 4'b0010 ;
        sreq[6] : gnt = 4'b0100 ;
        sreq[7] : gnt = 4'b1000 ;
        default : gnt = 4'b0000 ;
    endcase
end
这个是不是存在多驱动的问题?

看cliff关于index型的onehot状态机编码的论文
里面讲得很清楚

case不能这么用吧,印象中case是并发执行的。你这样会出现多个分支满足的情况。
另外确认了一下always块里即使用的组合逻辑,那个gnt信号也要定义成reg。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top